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

Side by Side Diff: src/platform/window_manager/window_manager.cc

Issue 2078031: wm: Fix override-redirect window stacking bug. (Closed) Base URL: ssh://git@gitrw.chromium.org:9222//chromeos.git
Patch Set: LOG(DFATAL) on invalid actor raise/lower Created 10 years, 7 months 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. 1 // Copyright (c) 2010 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/window_manager.h" 5 #include "window_manager/window_manager.h"
6 6
7 #include <unistd.h> 7 #include <unistd.h>
8 8
9 #include <cerrno> 9 #include <cerrno>
10 #include <cstdio> 10 #include <cstdio>
(...skipping 1200 matching lines...) Expand 10 before | Expand all | Expand 10 after
1211 // - Regular non-override-redirect windows' configuration calls are 1211 // - Regular non-override-redirect windows' configuration calls are
1212 // passed to us as ConfigureRequest events, so we would've already 1212 // passed to us as ConfigureRequest events, so we would've already
1213 // updated both their X and composited configuration in 1213 // updated both their X and composited configuration in
1214 // HandleConfigureRequest(). We don't need to do anything here. 1214 // HandleConfigureRequest(). We don't need to do anything here.
1215 // - For both types of window, we may have decided to move or resize the 1215 // - For both types of window, we may have decided to move or resize the
1216 // window ourselves earlier through a direct call to Window::Move() or 1216 // window ourselves earlier through a direct call to Window::Move() or
1217 // Resize(). In that case, we would've already updated their 1217 // Resize(). In that case, we would've already updated their
1218 // composited position (or at least started the animation) then. 1218 // composited position (or at least started the animation) then.
1219 1219
1220 if (win->override_redirect()) { 1220 if (win->override_redirect()) {
1221 // TODO: This possibly isn't really correct. We'll get this
1222 // notification if we were the ones who moved this window (which I
1223 // guess we shouldn't be doing, since it's override-redirect), so this
1224 // will effectively cancel out whatever animation we previously
1225 // started.
1226 win->MoveComposited(e.x, e.y, 0); 1221 win->MoveComposited(e.x, e.y, 0);
1227
1228 win->SaveClientPosition(e.x, e.y); 1222 win->SaveClientPosition(e.x, e.y);
1229 win->SaveClientSize(e.width, e.height); 1223 win->SaveClientSize(e.width, e.height);
1230 1224
1231 // When we see a stacking change for an override-redirect window, we 1225 // When we see a stacking change for an override-redirect window, we
1232 // attempt to restack its actor correspondingly. If we don't have an 1226 // attempt to restack its actor correspondingly. If we don't have an
1233 // actor for the X window directly under it, we walk down the stack 1227 // actor for the X window directly under it, we walk down the stack
1234 // until we find one. This is primarily needed for things like 1228 // until we find one.
1235 // xscreensaver in don't-use-the-MIT-screensaver-extension mode -- when
1236 // it activates and raises its screensaver window, we need to make sure
1237 // that it ends up on top of all other override-redirect windows.
1238 // TODO: We should do something similar for non-override-redirect
1239 // windows as well, but it's a) less critical there, since we already
1240 // restack their composited windows ourselves when we restack the
1241 // client windows, and b) tricky, because we also need to stack
1242 // compositing actors that aren't tied to X windows (e.g. the panel
1243 // bar, shadows, etc.).
1244 XWindow above_xid = e.above; 1229 XWindow above_xid = e.above;
1245 while (above_xid) { 1230 while (above_xid) {
1246 Window* above_win = GetWindow(above_xid); 1231 Window* above_win = GetWindow(above_xid);
1247 if (above_win) { 1232 Compositor::Actor* above_actor =
1233 above_win ? above_win->actor() :
1234 stacking_manager_->GetActorIfLayerXid(above_xid);
1235
1236 if (above_actor) {
1248 DLOG(INFO) << "Stacking override-redirect window " << win->xid_str() 1237 DLOG(INFO) << "Stacking override-redirect window " << win->xid_str()
1249 << "'s above " << above_win->xid_str() << "'s actor"; 1238 << "'s actor above window " << XidStr(above_xid) << "'s";
1250 win->StackCompositedAbove(above_win->actor(), NULL, false); 1239 win->StackCompositedAbove(above_actor, NULL, false);
1251 break; 1240 break;
1252 } 1241 }
1253 const XWindow* above_ptr = stacked_xids_->GetUnder(above_xid); 1242 const XWindow* above_ptr = stacked_xids_->GetUnder(above_xid);
1254 above_xid = above_ptr ? *above_ptr : 0; 1243 above_xid = above_ptr ? *above_ptr : 0;
1255 } 1244 }
1256 } else { 1245 } else {
1257 if (restacked) { 1246 if (restacked) {
1258 // _NET_CLIENT_LIST_STACKING only includes managed (i.e. 1247 // _NET_CLIENT_LIST_STACKING only includes managed (i.e.
1259 // non-override-redirect) windows, so we only update it when a 1248 // non-override-redirect) windows, so we only update it when a
1260 // managed window's stacking position changed. 1249 // managed window's stacking position changed.
(...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after
1633 return i->first; 1622 return i->first;
1634 } 1623 }
1635 return 0; 1624 return 0;
1636 } 1625 }
1637 1626
1638 void WindowManager::SendNotifySyskeyMessage(chromeos::WmIpcSystemKey key) { 1627 void WindowManager::SendNotifySyskeyMessage(chromeos::WmIpcSystemKey key) {
1639 WmIpc::Message msg(chromeos::WM_IPC_MESSAGE_CHROME_NOTIFY_SYSKEY_PRESSED); 1628 WmIpc::Message msg(chromeos::WM_IPC_MESSAGE_CHROME_NOTIFY_SYSKEY_PRESSED);
1640 msg.set_param(0, key); 1629 msg.set_param(0, key);
1641 const XWindow chrome_window = GetArbitraryChromeWindow(); 1630 const XWindow chrome_window = GetArbitraryChromeWindow();
1642 if (chrome_window) { 1631 if (chrome_window) {
1632 DLOG(INFO) << "Sending syskey notification with param " << key;
1643 wm_ipc()->SendMessage(chrome_window, msg); 1633 wm_ipc()->SendMessage(chrome_window, msg);
1644 LOG(INFO) << "Syskey notification sent, param(0)=" << key;
1645 } else { 1634 } else {
1646 LOG(WARNING) << "Not sending syskey notification: " 1635 LOG(WARNING) << "Not sending syskey notification: "
1647 << "Chrome currently doesn't have any windows open."; 1636 << "Chrome currently doesn't have any windows open.";
1648 } 1637 }
1649 } 1638 }
1650 1639
1651 void WindowManager::ToggleHotkeyOverlay() { 1640 void WindowManager::ToggleHotkeyOverlay() {
1652 Compositor::Actor* group = hotkey_overlay_->group(); 1641 Compositor::Actor* group = hotkey_overlay_->group();
1653 showing_hotkey_overlay_ = !showing_hotkey_overlay_; 1642 showing_hotkey_overlay_ = !showing_hotkey_overlay_;
1654 if (showing_hotkey_overlay_) { 1643 if (showing_hotkey_overlay_) {
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1699 } 1688 }
1700 } 1689 }
1701 1690
1702 void WindowManager::QueryKeyboardState() { 1691 void WindowManager::QueryKeyboardState() {
1703 vector<uint8_t> keycodes; 1692 vector<uint8_t> keycodes;
1704 xconn_->QueryKeyboardState(&keycodes); 1693 xconn_->QueryKeyboardState(&keycodes);
1705 hotkey_overlay_->HandleKeyboardState(keycodes); 1694 hotkey_overlay_->HandleKeyboardState(keycodes);
1706 } 1695 }
1707 1696
1708 } // namespace window_manager 1697 } // namespace window_manager
OLDNEW
« no previous file with comments | « src/platform/window_manager/stacking_manager.cc ('k') | src/platform/window_manager/window_manager_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698