From 7be5606abb88b44ea09613af5155b5f0cc8a3052 Mon Sep 17 00:00:00 2001 From: fluxgen <fluxgen> Date: Tue, 3 Jan 2006 10:02:46 +0000 Subject: using screen based vector for theme lists --- src/FbTk/Theme.cc | 67 ++++++++++++++++++++++++++++++++++++------------------- src/FbTk/Theme.hh | 12 +++++++--- 2 files changed, 53 insertions(+), 26 deletions(-) diff --git a/src/FbTk/Theme.cc b/src/FbTk/Theme.cc index 8978e11..be8192d 100644 --- a/src/FbTk/Theme.cc +++ b/src/FbTk/Theme.cc @@ -42,6 +42,27 @@ using namespace std; namespace FbTk { +struct LoadThemeHelper { + LoadThemeHelper():m_tm(ThemeManager::instance()) {} + void operator ()(Theme *tm) { + m_tm.loadTheme(*tm); + } + void operator ()(ThemeManager::ThemeList &tmlist) { + + for_each(tmlist.begin(), tmlist.end(), + *this); + // send reconfiguration signal to theme and listeners + ThemeManager::ThemeList::iterator it = tmlist.begin(); + ThemeManager::ThemeList::iterator it_end = tmlist.end(); + for (; it != it_end; ++it) { + (*it)->reconfigTheme(); + (*it)->reconfigSig().notify(); + } + } + + ThemeManager &m_tm; +}; + Theme::Theme(int screen_num):m_screen_num(screen_num) { ThemeManager::instance().registerTheme(*this); } @@ -65,26 +86,33 @@ ThemeManager::ThemeManager(): } bool ThemeManager::registerTheme(Theme &tm) { - if (m_max_screens < 0) + if (m_max_screens < 0) { m_max_screens = ScreenCount(FbTk::App::instance()->display()); + m_themes.resize(m_max_screens); + } // valid screen num? if (m_max_screens < tm.screenNum() || tm.screenNum() < 0) return false; // TODO: use find and return false if it's already there // instead of unique - m_themelist.push_back(&tm); - m_themelist.unique(); + + m_themes[tm.screenNum()].push_back(&tm); + m_themes[tm.screenNum()].unique(); return true; } bool ThemeManager::unregisterTheme(Theme &tm) { - m_themelist.remove(&tm); + if (m_max_screens < tm.screenNum() || tm.screenNum() < 0) + return false; + + m_themes[tm.screenNum()].remove(&tm); + return true; } bool ThemeManager::load(const std::string &filename, - const std::string &overlay_filename, int screen_num) { + const std::string &overlay_filename, int screen_num) { std::string location = FbTk::StringUtil::expandFilename(filename); std::string prefix = ""; @@ -136,31 +164,24 @@ bool ThemeManager::load(const std::string &filename, location.append("/pixmaps"); Image::addSearchPath(location); + LoadThemeHelper load_theme_helper; + // get list and go throu all the resources and load them - ThemeList::iterator theme_it = m_themelist.begin(); - const ThemeList::iterator theme_it_end = m_themelist.end(); - for (; theme_it != theme_it_end; ++theme_it) { - if (screen_num < 0) - loadTheme(**theme_it); - else if (screen_num == (*theme_it)->screenNum()) // specified screen - loadTheme(**theme_it); + // and then reconfigure them + if (screen_num < 0 || screen_num > m_max_screens) { + for_each(m_themes.begin(), + m_themes.end(), + load_theme_helper); + } else { + load_theme_helper(m_themes[screen_num]); } - // notify all themes that we reconfigured - theme_it = m_themelist.begin(); - for (; theme_it != theme_it_end; ++theme_it) { - // send reconfiguration signal to theme and listeners - if (screen_num < 0 || (*theme_it)->screenNum() == screen_num) { - (*theme_it)->reconfigTheme(); - (*theme_it)->reconfigSig().notify(); - } - } return true; } void ThemeManager::loadTheme(Theme &tm) { - std::list<ThemeItem_base *>::iterator i = tm.itemList().begin(); - std::list<ThemeItem_base *>::iterator i_end = tm.itemList().end(); + Theme::ItemList::iterator i = tm.itemList().begin(); + Theme::ItemList::iterator i_end = tm.itemList().end(); for (; i != i_end; ++i) { ThemeItem_base *resource = *i; if (!loadItem(*resource)) { diff --git a/src/FbTk/Theme.hh b/src/FbTk/Theme.hh index c5d8e36..aeef4f1 100644 --- a/src/FbTk/Theme.hh +++ b/src/FbTk/Theme.hh @@ -30,6 +30,7 @@ #include <string> #include <list> +#include <vector> #include <string> #include "XrmDatabaseHelper.hh" @@ -94,6 +95,8 @@ private: /// Hold ThemeItems. Use this to create a Theme set class Theme { public: + typedef std::list<ThemeItem_base *> ItemList; + explicit Theme(int screen_num); // create a theme for a specific screen virtual ~Theme(); virtual void reconfigTheme() = 0; @@ -113,7 +116,7 @@ public: private: const int m_screen_num; - typedef std::list<ThemeItem_base *> ItemList; + ItemList m_themeitems; FbTk::Subject m_reconfig_sig; }; @@ -125,6 +128,9 @@ private: */ class ThemeManager { public: + typedef std::list<FbTk::Theme *> ThemeList; + typedef std::vector<ThemeList> ScreenThemeVector; + static ThemeManager &instance(); /// load style file "filename" to screen bool load(const std::string &filename, const std::string &overlay_filename, int screen_num = -1); @@ -150,8 +156,8 @@ private: /// @return false if theme isn't registred in the manager bool unregisterTheme(FbTk::Theme &tm); /// map each theme manager to a screen - typedef std::list<FbTk::Theme *> ThemeList; - ThemeList m_themelist; + + ScreenThemeVector m_themes; int m_max_screens; XrmDatabaseHelper m_database; bool m_verbose; -- cgit v0.11.2