aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/FbTk/Theme.cc67
-rw-r--r--src/FbTk/Theme.hh12
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;
42 42
43namespace FbTk { 43namespace FbTk {
44 44
45struct LoadThemeHelper {
46 LoadThemeHelper():m_tm(ThemeManager::instance()) {}
47 void operator ()(Theme *tm) {
48 m_tm.loadTheme(*tm);
49 }
50 void operator ()(ThemeManager::ThemeList &tmlist) {
51
52 for_each(tmlist.begin(), tmlist.end(),
53 *this);
54 // send reconfiguration signal to theme and listeners
55 ThemeManager::ThemeList::iterator it = tmlist.begin();
56 ThemeManager::ThemeList::iterator it_end = tmlist.end();
57 for (; it != it_end; ++it) {
58 (*it)->reconfigTheme();
59 (*it)->reconfigSig().notify();
60 }
61 }
62
63 ThemeManager &m_tm;
64};
65
45Theme::Theme(int screen_num):m_screen_num(screen_num) { 66Theme::Theme(int screen_num):m_screen_num(screen_num) {
46 ThemeManager::instance().registerTheme(*this); 67 ThemeManager::instance().registerTheme(*this);
47} 68}
@@ -65,26 +86,33 @@ ThemeManager::ThemeManager():
65} 86}
66 87
67bool ThemeManager::registerTheme(Theme &tm) { 88bool ThemeManager::registerTheme(Theme &tm) {
68 if (m_max_screens < 0) 89 if (m_max_screens < 0) {
69 m_max_screens = ScreenCount(FbTk::App::instance()->display()); 90 m_max_screens = ScreenCount(FbTk::App::instance()->display());
91 m_themes.resize(m_max_screens);
92 }
70 93
71 // valid screen num? 94 // valid screen num?
72 if (m_max_screens < tm.screenNum() || tm.screenNum() < 0) 95 if (m_max_screens < tm.screenNum() || tm.screenNum() < 0)
73 return false; 96 return false;
74 // TODO: use find and return false if it's already there 97 // TODO: use find and return false if it's already there
75 // instead of unique 98 // instead of unique
76 m_themelist.push_back(&tm); 99
77 m_themelist.unique(); 100 m_themes[tm.screenNum()].push_back(&tm);
101 m_themes[tm.screenNum()].unique();
78 return true; 102 return true;
79} 103}
80 104
81bool ThemeManager::unregisterTheme(Theme &tm) { 105bool ThemeManager::unregisterTheme(Theme &tm) {
82 m_themelist.remove(&tm); 106 if (m_max_screens < tm.screenNum() || tm.screenNum() < 0)
107 return false;
108
109 m_themes[tm.screenNum()].remove(&tm);
110
83 return true; 111 return true;
84} 112}
85 113
86bool ThemeManager::load(const std::string &filename, 114bool ThemeManager::load(const std::string &filename,
87 const std::string &overlay_filename, int screen_num) { 115 const std::string &overlay_filename, int screen_num) {
88 std::string location = FbTk::StringUtil::expandFilename(filename); 116 std::string location = FbTk::StringUtil::expandFilename(filename);
89 std::string prefix = ""; 117 std::string prefix = "";
90 118
@@ -136,31 +164,24 @@ bool ThemeManager::load(const std::string &filename,
136 location.append("/pixmaps"); 164 location.append("/pixmaps");
137 Image::addSearchPath(location); 165 Image::addSearchPath(location);
138 166
167 LoadThemeHelper load_theme_helper;
168
139 // get list and go throu all the resources and load them 169 // get list and go throu all the resources and load them
140 ThemeList::iterator theme_it = m_themelist.begin(); 170 // and then reconfigure them
141 const ThemeList::iterator theme_it_end = m_themelist.end(); 171 if (screen_num < 0 || screen_num > m_max_screens) {
142 for (; theme_it != theme_it_end; ++theme_it) { 172 for_each(m_themes.begin(),
143 if (screen_num < 0) 173 m_themes.end(),
144 loadTheme(**theme_it); 174 load_theme_helper);
145 else if (screen_num == (*theme_it)->screenNum()) // specified screen 175 } else {
146 loadTheme(**theme_it); 176 load_theme_helper(m_themes[screen_num]);
147 } 177 }
148 178
149 // notify all themes that we reconfigured
150 theme_it = m_themelist.begin();
151 for (; theme_it != theme_it_end; ++theme_it) {
152 // send reconfiguration signal to theme and listeners
153 if (screen_num < 0 || (*theme_it)->screenNum() == screen_num) {
154 (*theme_it)->reconfigTheme();
155 (*theme_it)->reconfigSig().notify();
156 }
157 }
158 return true; 179 return true;
159} 180}
160 181
161void ThemeManager::loadTheme(Theme &tm) { 182void ThemeManager::loadTheme(Theme &tm) {
162 std::list<ThemeItem_base *>::iterator i = tm.itemList().begin(); 183 Theme::ItemList::iterator i = tm.itemList().begin();
163 std::list<ThemeItem_base *>::iterator i_end = tm.itemList().end(); 184 Theme::ItemList::iterator i_end = tm.itemList().end();
164 for (; i != i_end; ++i) { 185 for (; i != i_end; ++i) {
165 ThemeItem_base *resource = *i; 186 ThemeItem_base *resource = *i;
166 if (!loadItem(*resource)) { 187 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 @@
30 30
31#include <string> 31#include <string>
32#include <list> 32#include <list>
33#include <vector>
33#include <string> 34#include <string>
34 35
35#include "XrmDatabaseHelper.hh" 36#include "XrmDatabaseHelper.hh"
@@ -94,6 +95,8 @@ private:
94/// Hold ThemeItems. Use this to create a Theme set 95/// Hold ThemeItems. Use this to create a Theme set
95class Theme { 96class Theme {
96public: 97public:
98 typedef std::list<ThemeItem_base *> ItemList;
99
97 explicit Theme(int screen_num); // create a theme for a specific screen 100 explicit Theme(int screen_num); // create a theme for a specific screen
98 virtual ~Theme(); 101 virtual ~Theme();
99 virtual void reconfigTheme() = 0; 102 virtual void reconfigTheme() = 0;
@@ -113,7 +116,7 @@ public:
113 116
114private: 117private:
115 const int m_screen_num; 118 const int m_screen_num;
116 typedef std::list<ThemeItem_base *> ItemList; 119
117 ItemList m_themeitems; 120 ItemList m_themeitems;
118 FbTk::Subject m_reconfig_sig; 121 FbTk::Subject m_reconfig_sig;
119}; 122};
@@ -125,6 +128,9 @@ private:
125*/ 128*/
126class ThemeManager { 129class ThemeManager {
127public: 130public:
131 typedef std::list<FbTk::Theme *> ThemeList;
132 typedef std::vector<ThemeList> ScreenThemeVector;
133
128 static ThemeManager &instance(); 134 static ThemeManager &instance();
129 /// load style file "filename" to screen 135 /// load style file "filename" to screen
130 bool load(const std::string &filename, const std::string &overlay_filename, int screen_num = -1); 136 bool load(const std::string &filename, const std::string &overlay_filename, int screen_num = -1);
@@ -150,8 +156,8 @@ private:
150 /// @return false if theme isn't registred in the manager 156 /// @return false if theme isn't registred in the manager
151 bool unregisterTheme(FbTk::Theme &tm); 157 bool unregisterTheme(FbTk::Theme &tm);
152 /// map each theme manager to a screen 158 /// map each theme manager to a screen
153 typedef std::list<FbTk::Theme *> ThemeList; 159
154 ThemeList m_themelist; 160 ScreenThemeVector m_themes;
155 int m_max_screens; 161 int m_max_screens;
156 XrmDatabaseHelper m_database; 162 XrmDatabaseHelper m_database;
157 bool m_verbose; 163 bool m_verbose;