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

Side by Side Diff: src/platform/window_manager/stacking_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/stacking_manager.h" 5 #include "window_manager/stacking_manager.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/string_util.h" 9 #include "base/string_util.h"
10 #include "window_manager/atom_cache.h" 10 #include "window_manager/atom_cache.h"
11 #include "window_manager/util.h" 11 #include "window_manager/util.h"
12 #include "window_manager/window.h" 12 #include "window_manager/window.h"
13 #include "window_manager/x_connection.h" 13 #include "window_manager/x_connection.h"
14 14
15 using std::set; 15 using std::map;
16 using std::string; 16 using std::string;
17 using std::tr1::shared_ptr; 17 using std::tr1::shared_ptr;
18 using window_manager::util::FindWithDefault; 18 using window_manager::util::FindWithDefault;
19 using window_manager::util::XidStr;
19 20
20 namespace window_manager { 21 namespace window_manager {
21 22
22 StackingManager::StackingManager(XConnection* xconn, 23 StackingManager::StackingManager(XConnection* xconn,
23 Compositor* compositor, 24 Compositor* compositor,
24 AtomCache* atom_cache) 25 AtomCache* atom_cache)
25 : xconn_(xconn) { 26 : xconn_(xconn) {
26 XWindow root = xconn_->GetRootWindow(); 27 XWindow root = xconn_->GetRootWindow();
27 28
28 for (int i = kNumLayers - 1; i >= 0; --i) { 29 for (int i = kNumLayers - 1; i >= 0; --i) {
29 Layer layer = static_cast<Layer>(i); 30 Layer layer = static_cast<Layer>(i);
30 string name = StringPrintf("%s layer", LayerToName(layer)); 31 string name = StringPrintf("%s layer", LayerToName(layer));
31 32
32 XWindow xid = xconn_->CreateWindow(root, -1, -1, 1, 1, true, true, 0); 33 XWindow xid = xconn_->CreateWindow(root, -1, -1, 1, 1, true, true, 0);
33 xconn_->SetStringProperty(xid, atom_cache->GetXAtom(ATOM_WM_NAME), name); 34 xconn_->SetStringProperty(xid, atom_cache->GetXAtom(ATOM_WM_NAME), name);
34 xconn_->SetStringProperty( 35 xconn_->SetStringProperty(
35 xid, atom_cache->GetXAtom(ATOM_NET_WM_NAME), name); 36 xid, atom_cache->GetXAtom(ATOM_NET_WM_NAME), name);
36 layer_to_xid_[layer] = xid; 37 layer_to_xid_[layer] = xid;
37 xids_.insert(xid); 38 xid_to_layer_[xid] = layer;
38 39
39 shared_ptr<Compositor::Actor> actor(compositor->CreateGroup()); 40 shared_ptr<Compositor::Actor> actor(compositor->CreateGroup());
40 actor->SetName(name); 41 actor->SetName(StringPrintf("%s %s", name.c_str(), XidStr(xid).c_str()));
41 actor->SetVisibility(false); 42 actor->SetVisibility(false);
42 compositor->GetDefaultStage()->AddActor(actor.get()); 43 compositor->GetDefaultStage()->AddActor(actor.get());
43 actor->RaiseToTop(); 44 actor->RaiseToTop();
44 layer_to_actor_[layer] = actor; 45 layer_to_actor_[layer] = actor;
45 } 46 }
46 } 47 }
47 48
48 StackingManager::~StackingManager() { 49 StackingManager::~StackingManager() {
49 for (set<XWindow>::const_iterator it = xids_.begin(); it != xids_.end(); ++it) 50 for (map<XWindow, Layer>::const_iterator it = xid_to_layer_.begin();
50 xconn_->DestroyWindow(*it); 51 it != xid_to_layer_.end(); ++it)
52 xconn_->DestroyWindow(it->first);
51 } 53 }
52 54
53 bool StackingManager::StackWindowAtTopOfLayer(Window* win, Layer layer) { 55 bool StackingManager::StackWindowAtTopOfLayer(Window* win, Layer layer) {
54 DCHECK(win); 56 DCHECK(win);
55 57
56 Compositor::Actor* layer_actor = GetActorForLayer(layer); 58 Compositor::Actor* layer_actor = GetActorForLayer(layer);
57 59
58 // Find the next-lowest layer so we can stack the window's shadow 60 // Find the next-lowest layer so we can stack the window's shadow
59 // directly above it. 61 // directly above it.
60 // TODO: This won't work for the bottom layer; write additional code to 62 // TODO: This won't work for the bottom layer; write additional code to
(...skipping 28 matching lines...) Expand all
89 if (above) 91 if (above)
90 win->StackCompositedAbove(sibling->actor(), lower_layer_actor, true); 92 win->StackCompositedAbove(sibling->actor(), lower_layer_actor, true);
91 else 93 else
92 win->StackCompositedBelow(sibling->actor(), lower_layer_actor, true); 94 win->StackCompositedBelow(sibling->actor(), lower_layer_actor, true);
93 95
94 return above ? 96 return above ?
95 win->StackClientAbove(sibling->xid()) : 97 win->StackClientAbove(sibling->xid()) :
96 win->StackClientBelow(sibling->xid()); 98 win->StackClientBelow(sibling->xid());
97 } 99 }
98 100
101 Compositor::Actor* StackingManager::GetActorIfLayerXid(XWindow xid) {
102 map<XWindow, Layer>::const_iterator it = xid_to_layer_.find(xid);
103 if (it == xid_to_layer_.end())
104 return NULL;
105 return GetActorForLayer(it->second);
106 }
107
99 // static 108 // static
100 const char* StackingManager::LayerToName(Layer layer) { 109 const char* StackingManager::LayerToName(Layer layer) {
101 switch (layer) { 110 switch (layer) {
102 case LAYER_DEBUGGING: return "debugging"; 111 case LAYER_DEBUGGING: return "debugging";
103 case LAYER_HOTKEY_OVERLAY: return "hotkey overlay"; 112 case LAYER_HOTKEY_OVERLAY: return "hotkey overlay";
104 case LAYER_FULLSCREEN_PANEL: return "fullscreen panel"; 113 case LAYER_FULLSCREEN_PANEL: return "fullscreen panel";
105 case LAYER_DRAGGED_PANEL: return "dragged panel"; 114 case LAYER_DRAGGED_PANEL: return "dragged panel";
106 case LAYER_ACTIVE_TRANSIENT_WINDOW: return "active transient window"; 115 case LAYER_ACTIVE_TRANSIENT_WINDOW: return "active transient window";
107 case LAYER_PANEL_BAR_INPUT_WINDOW: return "panel bar input window"; 116 case LAYER_PANEL_BAR_INPUT_WINDOW: return "panel bar input window";
108 case LAYER_STATIONARY_PANEL_IN_BAR: return "static panel in bar"; 117 case LAYER_STATIONARY_PANEL_IN_BAR: return "static panel in bar";
(...skipping 14 matching lines...) Expand all
123 return layer_actor.get(); 132 return layer_actor.get();
124 } 133 }
125 134
126 XWindow StackingManager::GetXidForLayer(Layer layer) { 135 XWindow StackingManager::GetXidForLayer(Layer layer) {
127 XWindow xid = FindWithDefault(layer_to_xid_, layer, static_cast<XWindow>(0)); 136 XWindow xid = FindWithDefault(layer_to_xid_, layer, static_cast<XWindow>(0));
128 CHECK(xid) << "Invalid layer " << layer; 137 CHECK(xid) << "Invalid layer " << layer;
129 return xid; 138 return xid;
130 } 139 }
131 140
132 } // namespace window_manager 141 } // namespace window_manager
OLDNEW
« no previous file with comments | « src/platform/window_manager/stacking_manager.h ('k') | src/platform/window_manager/window_manager.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698