diff options
Diffstat (limited to 'src/FbTk/Theme.cc')
-rw-r--r-- | src/FbTk/Theme.cc | 67 |
1 files changed, 44 insertions, 23 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 | ||
43 | namespace FbTk { | 43 | namespace FbTk { |
44 | 44 | ||
45 | struct 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 | |||
45 | Theme::Theme(int screen_num):m_screen_num(screen_num) { | 66 | Theme::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 | ||
67 | bool ThemeManager::registerTheme(Theme &tm) { | 88 | bool 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 | ||
81 | bool ThemeManager::unregisterTheme(Theme &tm) { | 105 | bool 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 | ||
86 | bool ThemeManager::load(const std::string &filename, | 114 | bool 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 | ||
161 | void ThemeManager::loadTheme(Theme &tm) { | 182 | void 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)) { |