OLD | NEW |
1 // Copyright (c) 2009 The Chromium OS Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium OS 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 "window_manager/layout_manager.h" | 5 #include "window_manager/layout_manager.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <cmath> | 8 #include <cmath> |
9 #include <tr1/memory> | 9 #include <tr1/memory> |
10 extern "C" { | 10 extern "C" { |
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
281 if (win->transient_for_xid() != None) { | 281 if (win->transient_for_xid() != None) { |
282 ToplevelWindow* toplevel_owner = | 282 ToplevelWindow* toplevel_owner = |
283 GetToplevelWindowByXid(win->transient_for_xid()); | 283 GetToplevelWindowByXid(win->transient_for_xid()); |
284 if (toplevel_owner) { | 284 if (toplevel_owner) { |
285 transient_to_toplevel_[win->xid()] = toplevel_owner; | 285 transient_to_toplevel_[win->xid()] = toplevel_owner; |
286 toplevel_owner->AddTransientWindow(win); | 286 toplevel_owner->AddTransientWindow(win); |
287 | 287 |
288 if (mode_ == MODE_ACTIVE && | 288 if (mode_ == MODE_ACTIVE && |
289 active_toplevel_ != NULL && | 289 active_toplevel_ != NULL && |
290 active_toplevel_->IsWindowOrTransientFocused()) { | 290 active_toplevel_->IsWindowOrTransientFocused()) { |
291 // The _NET_ACTIVE_WINDOW property should already refer to | |
292 // 'active_toplevel_', since it previously had the focus. | |
293 active_toplevel_->TakeFocus(wm_->GetCurrentTimeFromServer()); | 291 active_toplevel_->TakeFocus(wm_->GetCurrentTimeFromServer()); |
294 } | 292 } |
295 break; | 293 break; |
296 } else { | 294 } else { |
297 LOG(WARNING) << "Ignoring " << win->xid_str() | 295 LOG(WARNING) << "Ignoring " << win->xid_str() |
298 << "'s WM_TRANSIENT_FOR hint of " | 296 << "'s WM_TRANSIENT_FOR hint of " |
299 << XidStr(win->transient_for_xid()) | 297 << XidStr(win->transient_for_xid()) |
300 << ", which isn't a toplevel window"; | 298 << ", which isn't a toplevel window"; |
301 // Continue on and treat the transient as a toplevel window. | 299 // Continue on and treat the transient as a toplevel window. |
302 } | 300 } |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
485 ToplevelWindow* toplevel = GetToplevelWindowOwningTransientWindow(*win); | 483 ToplevelWindow* toplevel = GetToplevelWindowOwningTransientWindow(*win); |
486 if (!toplevel) | 484 if (!toplevel) |
487 toplevel = GetToplevelWindowByWindow(*win); | 485 toplevel = GetToplevelWindowByWindow(*win); |
488 | 486 |
489 // If this is neither a toplevel nor transient window, we don't care | 487 // If this is neither a toplevel nor transient window, we don't care |
490 // about the focus change. | 488 // about the focus change. |
491 if (!toplevel) | 489 if (!toplevel) |
492 return false; | 490 return false; |
493 toplevel->HandleFocusChange(win, focus_in); | 491 toplevel->HandleFocusChange(win, focus_in); |
494 | 492 |
495 // When a transient window gets the focus, we say that its owner is the | 493 // Announce that the new window is the "active" window (in the |
496 // "active" window (in the _NET_ACTIVE_WINDOW sense). | 494 // _NET_ACTIVE_WINDOW sense), regardless of whether it's a toplevel |
| 495 // window or a transient. |
497 if (focus_in) | 496 if (focus_in) |
498 wm_->SetActiveWindowProperty(toplevel->win()->xid()); | 497 wm_->SetActiveWindowProperty(win->xid()); |
499 | 498 |
500 return true; | 499 return true; |
501 } | 500 } |
502 | 501 |
503 bool LayoutManager::HandleChromeMessage(const WmIpc::Message& msg) { | 502 bool LayoutManager::HandleChromeMessage(const WmIpc::Message& msg) { |
504 switch (msg.type()) { | 503 switch (msg.type()) { |
505 case WmIpc::Message::WM_MOVE_FLOATING_TAB: { | 504 case WmIpc::Message::WM_MOVE_FLOATING_TAB: { |
506 XWindow xid = msg.param(0); | 505 XWindow xid = msg.param(0); |
507 int x = msg.param(1); | 506 int x = msg.param(1); |
508 int y = msg.param(2); | 507 int y = msg.param(2); |
(...skipping 1186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1695 } | 1694 } |
1696 | 1695 |
1697 void LayoutManager::SendDeleteRequestToActiveWindow() { | 1696 void LayoutManager::SendDeleteRequestToActiveWindow() { |
1698 // TODO: If there's a focused transient window, the message should get | 1697 // TODO: If there's a focused transient window, the message should get |
1699 // sent to it instead. | 1698 // sent to it instead. |
1700 if (mode_ == MODE_ACTIVE && active_toplevel_) | 1699 if (mode_ == MODE_ACTIVE && active_toplevel_) |
1701 active_toplevel_->win()->SendDeleteRequest(wm_->GetCurrentTimeFromServer()); | 1700 active_toplevel_->win()->SendDeleteRequest(wm_->GetCurrentTimeFromServer()); |
1702 } | 1701 } |
1703 | 1702 |
1704 } // namespace chromeos | 1703 } // namespace chromeos |
OLD | NEW |