| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 #include <vector> | 5 #include <vector> |
| 6 | 6 |
| 7 #include <X11/extensions/shape.h> | 7 #include <X11/extensions/shape.h> |
| 8 #include <X11/Xlib.h> | 8 #include <X11/Xlib.h> |
| 9 | 9 |
| 10 // Get rid of X11 macros which conflict with gtest. | 10 // Get rid of X11 macros which conflict with gtest. |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 70 | 70 |
| 71 // The name of the hint to wait to get set or unset. | 71 // The name of the hint to wait to get set or unset. |
| 72 const char* hint_; | 72 const char* hint_; |
| 73 | 73 |
| 74 // Whether we are waiting for |hint| to be set or unset. | 74 // Whether we are waiting for |hint| to be set or unset. |
| 75 bool wait_till_set_; | 75 bool wait_till_set_; |
| 76 | 76 |
| 77 DISALLOW_COPY_AND_ASSIGN(WMStateWaiter); | 77 DISALLOW_COPY_AND_ASSIGN(WMStateWaiter); |
| 78 }; | 78 }; |
| 79 | 79 |
| 80 // Blocks till |window| gets activated. | |
| 81 class ActivationWaiter : public X11PropertyChangeWaiter { | |
| 82 public: | |
| 83 explicit ActivationWaiter(XID window) | |
| 84 : X11PropertyChangeWaiter(ui::GetX11RootWindow(), "_NET_ACTIVE_WINDOW"), | |
| 85 window_(window) { | |
| 86 } | |
| 87 | |
| 88 virtual ~ActivationWaiter() { | |
| 89 } | |
| 90 | |
| 91 private: | |
| 92 // X11PropertyChangeWaiter: | |
| 93 virtual bool ShouldKeepOnWaiting(const ui::PlatformEvent& event) OVERRIDE { | |
| 94 XID xid = 0; | |
| 95 ui::GetXIDProperty(ui::GetX11RootWindow(), "_NET_ACTIVE_WINDOW", &xid); | |
| 96 return xid != window_; | |
| 97 } | |
| 98 | |
| 99 XID window_; | |
| 100 | |
| 101 DISALLOW_COPY_AND_ASSIGN(ActivationWaiter); | |
| 102 }; | |
| 103 | |
| 104 // A NonClientFrameView with a window mask with the bottom right corner cut out. | 80 // A NonClientFrameView with a window mask with the bottom right corner cut out. |
| 105 class ShapedNonClientFrameView : public NonClientFrameView { | 81 class ShapedNonClientFrameView : public NonClientFrameView { |
| 106 public: | 82 public: |
| 107 explicit ShapedNonClientFrameView() { | 83 explicit ShapedNonClientFrameView() { |
| 108 } | 84 } |
| 109 | 85 |
| 110 virtual ~ShapedNonClientFrameView() { | 86 virtual ~ShapedNonClientFrameView() { |
| 111 } | 87 } |
| 112 | 88 |
| 113 // NonClientFrameView: | 89 // NonClientFrameView: |
| (...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 462 XSendEvent(display, DefaultRootWindow(display), False, | 438 XSendEvent(display, DefaultRootWindow(display), False, |
| 463 SubstructureRedirectMask | SubstructureNotifyMask, | 439 SubstructureRedirectMask | SubstructureNotifyMask, |
| 464 &xevent); | 440 &xevent); |
| 465 | 441 |
| 466 WMStateWaiter waiter(xid, "_NET_WM_STATE_FOCUSED", true); | 442 WMStateWaiter waiter(xid, "_NET_WM_STATE_FOCUSED", true); |
| 467 waiter.Wait(); | 443 waiter.Wait(); |
| 468 } | 444 } |
| 469 EXPECT_TRUE(widget.GetNativeWindow()->IsVisible()); | 445 EXPECT_TRUE(widget.GetNativeWindow()->IsVisible()); |
| 470 } | 446 } |
| 471 | 447 |
| 472 // Test that calling Widget::Deactivate() sets the widget as inactive wrt to | |
| 473 // Chrome even if it not possible to deactivate the window wrt to the x server. | |
| 474 // This behavior is required by several interactive_ui_tests. | |
| 475 TEST_F(DesktopWindowTreeHostX11Test, Deactivate) { | |
| 476 scoped_ptr<Widget> widget(CreateWidget(NULL)); | |
| 477 | |
| 478 ActivationWaiter waiter( | |
| 479 widget->GetNativeWindow()->GetHost()->GetAcceleratedWidget()); | |
| 480 widget->Show(); | |
| 481 widget->Activate(); | |
| 482 waiter.Wait(); | |
| 483 | |
| 484 widget->Deactivate(); | |
| 485 // Regardless of whether |widget|'s X11 window eventually gets deactivated, | |
| 486 // |widget|'s "active" state should change. | |
| 487 EXPECT_FALSE(widget->IsActive()); | |
| 488 | |
| 489 // |widget|'s X11 window should still be active. Reactivating |widget| should | |
| 490 // update the widget's "active" state. | |
| 491 // Note: Activating a widget whose X11 window is not active does not | |
| 492 // synchronously update the widget's "active" state. | |
| 493 widget->Activate(); | |
| 494 EXPECT_TRUE(widget->IsActive()); | |
| 495 } | |
| 496 | |
| 497 } // namespace views | 448 } // namespace views |
| OLD | NEW |