| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #import <Cocoa/Cocoa.h> | 5 #import <Cocoa/Cocoa.h> |
| 6 | 6 |
| 7 #include "ui/base/cocoa/focus_window_set.h" | 7 #include "ui/base/cocoa/focus_window_set.h" |
| 8 | 8 |
| 9 namespace ui { | 9 namespace ui { |
| 10 | 10 |
| 11 // This attempts to match OS X's native behavior, namely that a window | 11 // This attempts to match OS X's native behavior, namely that a window |
| 12 // is only ever deminiaturized if ALL windows on ALL workspaces are | 12 // is only ever deminiaturized if ALL windows on ALL workspaces are |
| 13 // miniaturized. (This callback runs before AppKit picks its own | 13 // miniaturized. (This callback runs before AppKit picks its own |
| 14 // window to deminiaturize, so we get to pick one from the right set.) | 14 // window to deminiaturize, so we get to pick one from the right set.) |
| 15 // | 15 // |
| 16 // In addition, limit to the windows on the current | 16 // In addition, limit to the windows on the current |
| 17 // workspace. Otherwise we jump spaces haphazardly. | 17 // workspace. Otherwise we jump spaces haphazardly. |
| 18 // | 18 // |
| 19 // NOTE: This is not perfect. If clicking the dock icon resulted in | 19 // NOTE: If this is called in the |
| 20 // switching spaces, isOnActiveSpace gives the answer for the PREVIOUS | 20 // applicationShouldHandleReopen:hasVisibleWindows: hook when clicking |
| 21 // space. This means that we actually raise the wrong space's | 21 // the dock icon, and that caused OS X to begin switch spaces, |
| 22 // windows. This seems to still work okay. | 22 // isOnActiveSpace gives the answer for the PREVIOUS space. This means |
| 23 // that we actually raise and focus the wrong space's windows, leaving |
| 24 // the new key window off-screen. To detect this, check if the key |
| 25 // window prior to calling is on an active space. |
| 23 // | 26 // |
| 24 // However, if we decide to deminiaturize a window instead, that | 27 // Also, if we decide to deminiaturize a window during a space switch, |
| 25 // results in switching spaces and switching back. Fortunately, this | 28 // that can switch spaces and then switch back. Fortunately, this only |
| 26 // only happens if, say, space 1 contains an app, space 2 contains a | 29 // happens if, say, space 1 contains an app, space 2 contains a |
| 27 // miniaturized browser. We click the icon, OS X switches to space 1, | 30 // miniaturized browser. We click the icon, OS X switches to space 1, |
| 28 // we deminiaturize the browser, and that triggers switching back. | 31 // we deminiaturize the browser, and that triggers switching back. |
| 32 // |
| 33 // TODO(davidben): To limit those cases, consider preferentially |
| 34 // deminiaturizing a window on the current space. |
| 29 void FocusWindowSet(const std::set<NSWindow*>& windows, | 35 void FocusWindowSet(const std::set<NSWindow*>& windows, |
| 30 bool allow_workspace_switch) { | 36 bool allow_workspace_switch) { |
| 31 NSArray* ordered_windows = [NSApp orderedWindows]; | 37 NSArray* ordered_windows = [NSApp orderedWindows]; |
| 32 NSWindow* frontmost_window = nil; | 38 NSWindow* frontmost_window = nil; |
| 33 NSWindow* frontmost_window_all_spaces = nil; | 39 NSWindow* frontmost_window_all_spaces = nil; |
| 34 NSWindow* frontmost_miniaturized_window = nil; | 40 NSWindow* frontmost_miniaturized_window = nil; |
| 35 bool all_miniaturized = true; | 41 bool all_miniaturized = true; |
| 36 for (int i = [ordered_windows count] - 1; i >= 0; i--) { | 42 for (int i = [ordered_windows count] - 1; i >= 0; i--) { |
| 37 NSWindow* win = [ordered_windows objectAtIndex:i]; | 43 NSWindow* win = [ordered_windows objectAtIndex:i]; |
| 38 if (windows.find(win) != windows.end()) { | 44 if (windows.find(win) != windows.end()) { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 59 [frontmost_window orderFront:nil]; | 65 [frontmost_window orderFront:nil]; |
| 60 } | 66 } |
| 61 if (frontmost_window) { | 67 if (frontmost_window) { |
| 62 [NSApp activateIgnoringOtherApps:YES]; | 68 [NSApp activateIgnoringOtherApps:YES]; |
| 63 [frontmost_window makeMainWindow]; | 69 [frontmost_window makeMainWindow]; |
| 64 [frontmost_window makeKeyWindow]; | 70 [frontmost_window makeKeyWindow]; |
| 65 } | 71 } |
| 66 } | 72 } |
| 67 | 73 |
| 68 } // namespace ui | 74 } // namespace ui |
| OLD | NEW |