news download themes documentation links










Theme.hh

00001 // Theme.hh for FbTk - Fluxbox ToolKit
00002 // Copyright (c) 2002 - 2003 Henrik Kinnunen (fluxgen at users.sourceforge.net)
00003 //
00004 // Permission is hereby granted, free of charge, to any person obtaining a
00005 // copy of this software and associated documentation files (the "Software"),
00006 // to deal in the Software without restriction, including without limitation
00007 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
00008 // and/or sell copies of the Software, and to permit persons to whom the
00009 // Software is furnished to do so, subject to the following conditions:
00010 //
00011 // The above copyright notice and this permission notice shall be included in
00012 // all copies or substantial portions of the Software.
00013 //
00014 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
00015 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00016 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
00017 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00018 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
00019 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
00020 // DEALINGS IN THE SOFTWARE.
00021 
00022 // $Id: Theme.hh,v 1.15 2004/01/02 22:55:15 fluxgen Exp $
00023 
00028 #ifndef FBTK_THEME_HH
00029 #define FBTK_THEME_HH
00030 
00031 #include <string>
00032 #include <list>
00033 #include <string>
00034 
00035 #include "XrmDatabaseHelper.hh"
00036 #include "Subject.hh"
00037 
00038 namespace FbTk {
00039 
00040 class Theme;
00041 
00043 
00046 class ThemeItem_base {
00047 public:
00048     ThemeItem_base(const std::string &name, const std::string &altname):
00049         m_name(name), m_altname(altname) { }
00050     virtual ~ThemeItem_base() { }
00051     virtual void setFromString(const char *str) = 0;
00052     virtual void setDefaultValue() = 0;
00053     virtual void load() = 0; // if it needs to load additional stuff
00054     const std::string &name() const { return m_name; }
00055     const std::string &altName() const { return m_altname; }
00056 private:
00057     std::string m_name, m_altname;
00058 };
00059 
00060 
00063 template <typename T>
00064 class ThemeItem:public ThemeItem_base {
00065 public:
00066     ThemeItem(FbTk::Theme &tm, const std::string &name, const std::string &altname);
00067     virtual ~ThemeItem();
00069     void setDefaultValue(); 
00071     void setFromString(const char *strval);
00073     void load();
00078     inline T& operator*() { return m_value; }
00079     inline const T& operator*() const { return m_value; }
00080     inline T *operator->() { return &m_value; }
00081     inline const T *operator->() const { return &m_value; }
00084     FbTk::Theme &theme() { return m_tm; }
00085 private:
00086 
00087     T m_value;
00088     FbTk::Theme &m_tm;
00089 };
00090 
00091 
00093 class Theme {
00094 public:
00095     explicit Theme(int screen_num); // create a theme for a specific screen
00096     virtual ~Theme();
00097     virtual void reconfigTheme() = 0;
00098     int screenNum() const { return m_screen_num; }
00099     std::list<ThemeItem_base *> &itemList() { return m_themeitems; }
00100     const std::list<ThemeItem_base *> &itemList() const { return m_themeitems; }
00102     template <typename T>
00103     void add(ThemeItem<T> &item);
00105     template <typename T>
00106     void remove(ThemeItem<T> &item);
00107     virtual bool fallback(ThemeItem_base &) { return false; }
00108     FbTk::Subject &reconfigSig() { return m_reconfig_sig; }
00109     const FbTk::Subject &reconfigSig() const { return m_reconfig_sig; }
00110 
00111     
00112 private:
00113     const int m_screen_num;
00114     typedef std::list<ThemeItem_base *> ItemList;
00115     ItemList m_themeitems;
00116     FbTk::Subject m_reconfig_sig;
00117 };
00118 
00119 
00121 
00124 class ThemeManager {
00125 public:
00126     static ThemeManager &instance();
00128     bool load(const std::string &filename, int screen_num = -1);
00129     std::string resourceValue(const std::string &name, const std::string &altname);
00130     void loadTheme(Theme &tm);
00131     bool loadItem(ThemeItem_base &resource);
00132     bool loadItem(ThemeItem_base &resource, const std::string &name, const std::string &altname);
00133 
00134     bool verbose() const { return m_verbose; }
00135     void setVerbose(bool value) { m_verbose = value; }
00136     //    void listItems();
00137 private:
00138     ThemeManager();
00139     ~ThemeManager() { }
00140 
00141     friend class FbTk::Theme; // so only theme can register itself in constructor
00144     bool registerTheme(FbTk::Theme &tm); 
00146     bool unregisterTheme(FbTk::Theme &tm);
00148     typedef std::list<FbTk::Theme *> ThemeList;
00149     ThemeList m_themelist;
00150     int m_max_screens;
00151     XrmDatabaseHelper m_database;
00152     bool m_verbose;
00153 
00154     std::string m_themelocation;
00155 };
00156 
00157 
00158 
00159 template <typename T>
00160 ThemeItem<T>::ThemeItem(FbTk::Theme &tm, 
00161                         const std::string &name, const std::string &altname):
00162     ThemeItem_base(name, altname),
00163     m_tm(tm) {
00164     tm.add(*this);
00165     setDefaultValue();
00166 }
00167 
00168 template <typename T>
00169 ThemeItem<T>::~ThemeItem() {
00170     m_tm.remove(*this);
00171 }
00172 
00173 template <typename T>
00174 void Theme::add(ThemeItem<T> &item) {
00175     m_themeitems.push_back(&item);
00176     m_themeitems.unique();
00177 }
00178 
00179 template <typename T>
00180 void Theme::remove(ThemeItem<T> &item)  {
00181     m_themeitems.remove(&item);
00182 }
00183 
00184 } // end namespace FbTk
00185 
00186 #endif // FBTK_THEME_HH
00187 

Fluxbox CVS-Jan-2003




      



Got comments about the page? Send them to webmaster.
If you have general Fluxbox related questions ask them on our irc channel or mailing lists.

Show Source








Designed by aLEczapKA