diff options
| author | Andrea Azzarone <azzaronea@gmail.com> | 2013-02-05 23:21:38 +0000 |
|---|---|---|
| committer | Tarmac <> | 2013-02-05 23:21:38 +0000 |
| commit | 1eb98bb3072321232b192be65d648725cd579c21 (patch) | |
| tree | 33ccf696186246b458082b97f5ec4bbaf4b7c644 | |
| parent | a7c4ad0f360a635d34d16f75bfdb09b44ce93602 (diff) | |
| parent | bc910bbc7bab78a2d5c258dadfc1f13934e3be2d (diff) | |
Improve StandaloneWindowManager.
Approved by Marco Trevisan (TreviƱo). (bzr r3128)
| -rw-r--r-- | unity-shared/StandaloneWindowManager.cpp | 238 | ||||
| -rw-r--r-- | unity-shared/StandaloneWindowManager.h | 8 |
2 files changed, 145 insertions, 101 deletions
diff --git a/unity-shared/StandaloneWindowManager.cpp b/unity-shared/StandaloneWindowManager.cpp index cba2db612..9bac8bf18 100644 --- a/unity-shared/StandaloneWindowManager.cpp +++ b/unity-shared/StandaloneWindowManager.cpp @@ -84,41 +84,59 @@ StandaloneWindowManager::StandaloneWindowManager() Window StandaloneWindowManager::GetActiveWindow() const { - for (auto const& it : standalone_windows_) - if (it.second->active) - return it.second->Xid(); + for (auto const& window : standalone_windows_) + if (window->active) + return window->Xid(); return 0; } +StandaloneWindow::Ptr StandaloneWindowManager::GetWindowByXid(Window window_id) const +{ + auto begin = standalone_windows_.begin(); + auto end = standalone_windows_.end(); + auto it = std::find_if(begin, end, [window_id] (StandaloneWindow::Ptr window) { + return window->Xid() == window_id; + }); + + if (it != end) + return *it; + else + return StandaloneWindow::Ptr(); +} + std::vector<Window> StandaloneWindowManager::GetWindowsInStackingOrder() const { - return std::vector<Window>(); + std::vector<Window> ret; + for (auto const& window : standalone_windows_) + ret.push_back(window->Xid()); + + return ret; } bool StandaloneWindowManager::IsWindowMaximized(Window window_id) const { - auto it = standalone_windows_.find(window_id); - if (it != standalone_windows_.end()) - return it->second->maximized; + auto window = GetWindowByXid(window_id); + if (window) + return window->maximized; return false; } bool StandaloneWindowManager::IsWindowDecorated(Window window_id) const { - auto it = standalone_windows_.find(window_id); - if (it != standalone_windows_.end() && it->second->has_decorations) - return it->second->decorated; + auto window = GetWindowByXid(window_id); + if (window && window->has_decorations) + return window->decorated; return false; } bool StandaloneWindowManager::IsWindowOnCurrentDesktop(Window window_id) const { - auto it = standalone_windows_.find(window_id); - if (it != standalone_windows_.end()) - return (it->second->current_desktop == current_desktop_); + auto window = GetWindowByXid(window_id); + if (window) + return (window->current_desktop == current_desktop_); return true; } @@ -130,72 +148,73 @@ bool StandaloneWindowManager::IsWindowObscured(Window window_id) const bool StandaloneWindowManager::IsWindowMapped(Window window_id) const { - auto it = standalone_windows_.find(window_id); - if (it != standalone_windows_.end()) - return it->second->mapped; + auto window = GetWindowByXid(window_id); + if (window) + return window->mapped; return true; } bool StandaloneWindowManager::IsWindowVisible(Window window_id) const { - auto it = standalone_windows_.find(window_id); - if (it != standalone_windows_.end()) - return it->second->visible; + auto window = GetWindowByXid(window_id); + if (window) + return window->visible; return true; } bool StandaloneWindowManager::IsWindowOnTop(Window window_id) const { - auto it = standalone_windows_.find(window_id); - if (it != standalone_windows_.end()) - return it->second->on_top; + auto window = GetWindowByXid(window_id); + if (window) + return window->on_top; return false; } bool StandaloneWindowManager::IsWindowClosable(Window window_id) const { - auto it = standalone_windows_.find(window_id); - if (it != standalone_windows_.end()) - return it->second->closable; + auto window = GetWindowByXid(window_id); + if (window) + return window->closable; return false; } bool StandaloneWindowManager::IsWindowMinimized(Window window_id) const { - auto it = standalone_windows_.find(window_id); - if (it != standalone_windows_.end()) - return it->second->minimized; + auto window = GetWindowByXid(window_id); + if (window) + return window->minimized; return false; } bool StandaloneWindowManager::IsWindowMinimizable(Window window_id) const { - auto it = standalone_windows_.find(window_id); - if (it != standalone_windows_.end()) - return it->second->minimizable; + auto window = GetWindowByXid(window_id); + + if (window) + return window->minimizable; return false; } bool StandaloneWindowManager::IsWindowMaximizable(Window window_id) const { - auto it = standalone_windows_.find(window_id); - if (it != standalone_windows_.end()) - return it->second->maximizable; + auto window = GetWindowByXid(window_id); + if (window) + return window->maximizable; return false; } bool StandaloneWindowManager::HasWindowDecorations(Window window_id) const { - auto it = standalone_windows_.find(window_id); - if (it != standalone_windows_.end()) - return it->second->has_decorations; + auto window = GetWindowByXid(window_id); + if (window) + return window->has_decorations; return false; } @@ -212,38 +231,34 @@ bool StandaloneWindowManager::InShowDesktop() const void StandaloneWindowManager::Decorate(Window window_id) const { - auto it = standalone_windows_.find(window_id); - if (it != standalone_windows_.end()) - { - it->second->decorated = it->second->has_decorations(); - } + auto window = GetWindowByXid(window_id); + if (window) + window->decorated = window->has_decorations(); } void StandaloneWindowManager::Undecorate(Window window_id) const { - auto it = standalone_windows_.find(window_id); - if (it != standalone_windows_.end()) - { - it->second->decorated = false; - } + auto window = GetWindowByXid(window_id); + if (window) + window->decorated = false; } void StandaloneWindowManager::Maximize(Window window_id) { - auto it = standalone_windows_.find(window_id); - if (it != standalone_windows_.end()) + auto window = GetWindowByXid(window_id); + if (window) { - it->second->maximized = true; + window->maximized = true; Undecorate(window_id); } } void StandaloneWindowManager::Restore(Window window_id) { - auto it = standalone_windows_.find(window_id); - if (it != standalone_windows_.end()) + auto window = GetWindowByXid(window_id); + if (window) { - it->second->maximized = false; + window->maximized = false; Decorate(window_id); } } @@ -258,55 +273,81 @@ void StandaloneWindowManager::RestoreAt(Window window_id, int x, int y) void StandaloneWindowManager::UnMinimize(Window window_id) { - auto it = standalone_windows_.find(window_id); - if (it != standalone_windows_.end()) + auto window = GetWindowByXid(window_id); + if (window) { - it->second->minimized = false; + window->minimized = false; - if (it->second->maximized) - { + if (window->maximized) Undecorate(window_id); - } } } void StandaloneWindowManager::Minimize(Window window_id) { - auto it = standalone_windows_.find(window_id); - if (it != standalone_windows_.end()) + auto window = GetWindowByXid(window_id); + if (window) { - it->second->minimized = true; + window->minimized = true; - if (it->second->maximized) - { + if (window->maximized) Decorate(window_id); - } } } void StandaloneWindowManager::Close(Window window_id) { - standalone_windows_.erase(window_id); + standalone_windows_.remove_if([window_id] (StandaloneWindow::Ptr window) { + return window->Xid() == window_id; + }); } void StandaloneWindowManager::Activate(Window window_id) { - auto it = standalone_windows_.find(window_id); - if (it != standalone_windows_.end()) - { + auto window = GetWindowByXid(window_id); + if (window) // This will automatically set the others active windows as unactive - it->second->active = true; - } + window->active = true; +} + +void StandaloneWindowManager::Lower(Window window_id) +{ + auto begin = standalone_windows_.begin(); + auto end = standalone_windows_.end(); + auto window = std::find_if(begin, end, [window_id] (StandaloneWindow::Ptr window) { + return window->Xid() == window_id; + }); + + if (window != end) + standalone_windows_.splice(begin, standalone_windows_, window); } void StandaloneWindowManager::Raise(Window window_id) -{} +{ + auto end = standalone_windows_.end(); + auto window = std::find_if(standalone_windows_.begin(), end, [window_id] (StandaloneWindow::Ptr window) { + return window->Xid() == window_id; + }); -void StandaloneWindowManager::Lower(Window window_id) -{} + if (window != end) + standalone_windows_.splice(end, standalone_windows_, window); +} void StandaloneWindowManager::RestackBelow(Window window_id, Window sibiling_id) -{} +{ + auto end = standalone_windows_.end(); + auto begin = standalone_windows_.begin(); + + auto window = std::find_if(begin, end, [window_id] (StandaloneWindow::Ptr window) { + return window->Xid() == window_id; + }); + auto sibiling = std::find_if(begin, end, [sibiling_id] (StandaloneWindow::Ptr window) { + return window->Xid() == sibiling_id; + }); + + if (window != end && sibiling != end) + standalone_windows_.splice(sibiling, standalone_windows_, window); +} void StandaloneWindowManager::TerminateScale() {} @@ -375,9 +416,9 @@ bool StandaloneWindowManager::IsViewPortSwitchStarted() const void StandaloneWindowManager::MoveResizeWindow(Window window_id, nux::Geometry geometry) { - auto it = standalone_windows_.find(window_id); - if (it != standalone_windows_.end()) - it->second->geo = geometry; + auto window = GetWindowByXid(window_id); + if (window) + window->geo = geometry; } void StandaloneWindowManager::StartMove(Window window_id, int x, int y) @@ -388,27 +429,27 @@ void StandaloneWindowManager::StartMove(Window window_id, int x, int y) int StandaloneWindowManager::GetWindowMonitor(Window window_id) const { - auto it = standalone_windows_.find(window_id); - if (it != standalone_windows_.end()) - return it->second->monitor; + auto window = GetWindowByXid(window_id); + if (window) + return window->monitor; return -1; } nux::Geometry StandaloneWindowManager::GetWindowGeometry(Window window_id) const { - auto it = standalone_windows_.find(window_id); - if (it != standalone_windows_.end()) - return it->second->geo; + auto window = GetWindowByXid(window_id); + if (window) + return window->geo; return nux::Geometry(0, 0, 1, 1); } nux::Geometry StandaloneWindowManager::GetWindowSavedGeometry(Window window_id) const { - auto it = standalone_windows_.find(window_id); - if (it != standalone_windows_.end()) - return it->second->geo; + auto window = GetWindowByXid(window_id); + if (window) + return window->geo; return nux::Geometry(); } @@ -430,9 +471,9 @@ void StandaloneWindowManager::SetWorkareaGeometry(nux::Geometry const& geo) nux::Size StandaloneWindowManager::GetWindowDecorationSize(Window window_id, WindowManager::Edge edge) const { - auto it = standalone_windows_.find(window_id); - if (it != standalone_windows_.end()) - return it->second->deco_sizes[unsigned(edge)]; + auto window = GetWindowByXid(window_id); + if (window) + return window->deco_sizes[unsigned(edge)]; return nux::Size(); } @@ -494,9 +535,9 @@ bool StandaloneWindowManager::RestoreInputFocus() std::string StandaloneWindowManager::GetWindowName(Window window_id) const { - auto it = standalone_windows_.find(window_id); - if (it != standalone_windows_.end()) - return it->second->name; + auto window = GetWindowByXid(window_id); + if (window) + return window->name; return ""; } @@ -514,7 +555,8 @@ void StandaloneWindowManager::AddStandaloneWindow(StandaloneWindow::Ptr const& w return; auto xid = window->Xid(); - standalone_windows_[xid] = window; + Close(xid); + standalone_windows_.push_back(window); window->mapped.changed.connect([this, xid] (bool v) {v ? window_mapped(xid) : window_unmapped(xid);}); window->visible.changed.connect([this, xid] (bool v) {v ? window_shown(xid) : window_hidden(xid);}); @@ -530,9 +572,9 @@ void StandaloneWindowManager::AddStandaloneWindow(StandaloneWindow::Ptr const& w return; // Ensuring that this is the only active window we have on screen - for (auto const& it : standalone_windows_) - if (it.second->Xid() != xid && it.second->active) - it.second->active = false; + for (auto const& window : standalone_windows_) + if (window->Xid() != xid && window->active) + window->active = false; window_focus_changed(xid); }); @@ -540,7 +582,7 @@ void StandaloneWindowManager::AddStandaloneWindow(StandaloneWindow::Ptr const& w window->active = true; } -std::map<Window, StandaloneWindow::Ptr> StandaloneWindowManager::GetStandaloneWindows() const +std::list<StandaloneWindow::Ptr> StandaloneWindowManager::GetStandaloneWindows() const { return standalone_windows_; } diff --git a/unity-shared/StandaloneWindowManager.h b/unity-shared/StandaloneWindowManager.h index 7e20f52e4..d34836432 100644 --- a/unity-shared/StandaloneWindowManager.h +++ b/unity-shared/StandaloneWindowManager.h @@ -22,7 +22,7 @@ #define UNITYSHARED_STANDALONE_WINDOW_MANAGER_H #include "unity-shared/WindowManager.h" -#include <map> +#include <list> #include <NuxCore/Property.h> namespace unity @@ -146,7 +146,7 @@ public: // Mock functions void AddStandaloneWindow(StandaloneWindow::Ptr const& window); - std::map<Window, StandaloneWindow::Ptr> GetStandaloneWindows() const; + std::list<StandaloneWindow::Ptr> GetStandaloneWindows() const; void SetScaleActive(bool scale_active); void SetScaleActiveForGroup(bool scale_active_for_group); @@ -160,6 +160,8 @@ protected: virtual void AddProperties(GVariantBuilder* builder); private: + StandaloneWindow::Ptr GetWindowByXid(Window window_id) const; + bool expo_state_; bool in_show_desktop_; bool scale_active_; @@ -168,7 +170,7 @@ private: nux::Size viewport_size_; nux::Point current_vp_; nux::Geometry workarea_geo_; - std::map<Window, StandaloneWindow::Ptr> standalone_windows_; + std::list<StandaloneWindow::Ptr> standalone_windows_; }; } |
