Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: MaximInterface
Diff: WindowManager.cpp
- Revision:
- 0:33d4e66780c0
- Child:
- 7:66c5dedc750b
diff -r 000000000000 -r 33d4e66780c0 WindowManager.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/WindowManager.cpp Fri Feb 24 11:23:12 2017 -0600
@@ -0,0 +1,128 @@
+/*******************************************************************************
+* Copyright (C) 2017 Maxim Integrated Products, Inc., All Rights Reserved.
+*
+* Permission is hereby granted, free of charge, to any person obtaining a
+* copy of this software and associated documentation files (the "Software"),
+* to deal in the Software without restriction, including without limitation
+* the rights to use, copy, modify, merge, publish, distribute, sublicense,
+* and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
+* OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+* OTHER DEALINGS IN THE SOFTWARE.
+*
+* Except as contained in this notice, the name of Maxim Integrated
+* Products, Inc. shall not be used except as stated in the Maxim Integrated
+* Products, Inc. Branding Policy.
+*
+* The mere transfer of this software does not imply any licenses
+* of trade secrets, proprietary technology, copyrights, patents,
+* trademarks, maskwork rights, or any other form of intellectual
+* property whatsoever. Maxim Integrated Products, Inc. retains all
+* ownership rights.
+*******************************************************************************/
+
+#include <algorithm>
+#include <functional>
+#include "Bitmap.hpp"
+#include "WindowManager.hpp"
+
+static void deleteWindow(Window * window)
+{
+ delete window;
+}
+
+WindowManager::~WindowManager()
+{
+ // Free all windows.
+ std::for_each(m_windowStack.begin(), m_windowStack.end(), deleteWindow);
+ std::for_each(m_actionQueue.begin(), m_actionQueue.end(), deleteWindow);
+}
+
+void WindowManager::processAction(Window * window)
+{
+ if (window == NULL)
+ {
+ if (!m_windowStack.empty())
+ {
+ delete m_windowStack.back();
+ m_windowStack.pop_back();
+ }
+ }
+ else
+ {
+ m_windowStack.push_back(window);
+ }
+}
+
+Bitmap WindowManager::render() const
+{
+ return m_windowStack.empty() ? Bitmap(m_width, m_height) : m_windowStack.back()->render();
+}
+
+void WindowManager::push(Window * window)
+{
+ if (window != NULL)
+ {
+ window->setWidth(m_width);
+ window->setHeight(m_height);
+ window->setX(0);
+ window->setY(0);
+ window->setWindowManager(NULL);
+ m_actionQueue.push_back(window);
+ }
+}
+
+void WindowManager::pop()
+{
+ m_actionQueue.push_back(NULL);
+}
+
+bool WindowManager::update()
+{
+ bool redraw = false;
+
+ // Perform all queued push / pop actions.
+ if (!m_actionQueue.empty())
+ {
+ if (!m_windowStack.empty())
+ {
+ m_windowStack.back()->setWindowManager(NULL);
+ }
+ std::for_each(m_actionQueue.begin(), m_actionQueue.end(),
+ std::bind1st(std::mem_fun(&WindowManager::processAction), this));
+ m_actionQueue.clear();
+ if (!m_windowStack.empty())
+ {
+ m_windowStack.back()->setWindowManager(this);
+ }
+ redraw = true;
+ }
+
+ // Update all windows.
+ for (std::vector<Window *>::reverse_iterator it = m_windowStack.rbegin(); it != m_windowStack.rend(); it++)
+ {
+ if ((*it)->update() && (it == m_windowStack.rbegin()))
+ {
+ redraw = true;
+ }
+ }
+
+ return redraw;
+}
+
+void WindowManager::processKey(Key key)
+{
+ if (!m_windowStack.empty())
+ {
+ m_windowStack.back()->processKey(key);
+ }
+}