diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/FbCommands.cc | 3 | ||||
-rw-r--r-- | src/FbTk/Theme.cc | 19 | ||||
-rw-r--r-- | src/FbTk/Theme.hh | 2 | ||||
-rw-r--r-- | src/Screen.cc | 2 | ||||
-rw-r--r-- | src/fluxbox.cc | 9 | ||||
-rw-r--r-- | src/fluxbox.hh | 72 |
6 files changed, 65 insertions, 42 deletions
diff --git a/src/FbCommands.cc b/src/FbCommands.cc index cdecc2b..e188a40 100644 --- a/src/FbCommands.cc +++ b/src/FbCommands.cc | |||
@@ -213,7 +213,8 @@ SetStyleCmd::SetStyleCmd(const std::string &filename):m_filename(filename) { | |||
213 | void SetStyleCmd::execute() { | 213 | void SetStyleCmd::execute() { |
214 | Fluxbox::instance()->saveStyleFilename(m_filename.c_str()); | 214 | Fluxbox::instance()->saveStyleFilename(m_filename.c_str()); |
215 | Fluxbox::instance()->save_rc(); | 215 | Fluxbox::instance()->save_rc(); |
216 | FbTk::ThemeManager::instance().load(m_filename); | 216 | FbTk::ThemeManager::instance().load(m_filename, |
217 | Fluxbox::instance()->getStyleOverlayFilename()); | ||
217 | } | 218 | } |
218 | 219 | ||
219 | void ShowRootMenuCmd::execute() { | 220 | void ShowRootMenuCmd::execute() { |
diff --git a/src/FbTk/Theme.cc b/src/FbTk/Theme.cc index e6a07d0..8978e11 100644 --- a/src/FbTk/Theme.cc +++ b/src/FbTk/Theme.cc | |||
@@ -83,7 +83,8 @@ bool ThemeManager::unregisterTheme(Theme &tm) { | |||
83 | return true; | 83 | return true; |
84 | } | 84 | } |
85 | 85 | ||
86 | bool ThemeManager::load(const std::string &filename, int screen_num) { | 86 | bool ThemeManager::load(const std::string &filename, |
87 | const std::string &overlay_filename, int screen_num) { | ||
87 | std::string location = FbTk::StringUtil::expandFilename(filename); | 88 | std::string location = FbTk::StringUtil::expandFilename(filename); |
88 | std::string prefix = ""; | 89 | std::string prefix = ""; |
89 | 90 | ||
@@ -107,6 +108,20 @@ bool ThemeManager::load(const std::string &filename, int screen_num) { | |||
107 | if (!m_database.load(location.c_str())) | 108 | if (!m_database.load(location.c_str())) |
108 | return false; | 109 | return false; |
109 | 110 | ||
111 | |||
112 | if (!overlay_filename.empty()) { | ||
113 | std::string overlay_location = FbTk::StringUtil::expandFilename(overlay_filename); | ||
114 | if (FileUtil::isRegularFile(overlay_location.c_str())) { | ||
115 | XrmDatabaseHelper overlay_db; | ||
116 | if (overlay_db.load(overlay_location.c_str())) { | ||
117 | // after a merge the src_db is destroyed | ||
118 | // so, make sure XrmDatabaseHelper::m_database == 0 | ||
119 | XrmMergeDatabases(*overlay_db, &(*m_database)); | ||
120 | *overlay_db = 0; | ||
121 | } | ||
122 | } | ||
123 | } | ||
124 | |||
110 | // relies on the fact that load_rc clears search paths each time | 125 | // relies on the fact that load_rc clears search paths each time |
111 | if (m_themelocation != "") { | 126 | if (m_themelocation != "") { |
112 | Image::removeSearchPath(m_themelocation); | 127 | Image::removeSearchPath(m_themelocation); |
@@ -129,8 +144,8 @@ bool ThemeManager::load(const std::string &filename, int screen_num) { | |||
129 | loadTheme(**theme_it); | 144 | loadTheme(**theme_it); |
130 | else if (screen_num == (*theme_it)->screenNum()) // specified screen | 145 | else if (screen_num == (*theme_it)->screenNum()) // specified screen |
131 | loadTheme(**theme_it); | 146 | loadTheme(**theme_it); |
132 | |||
133 | } | 147 | } |
148 | |||
134 | // notify all themes that we reconfigured | 149 | // notify all themes that we reconfigured |
135 | theme_it = m_themelist.begin(); | 150 | theme_it = m_themelist.begin(); |
136 | for (; theme_it != theme_it_end; ++theme_it) { | 151 | for (; theme_it != theme_it_end; ++theme_it) { |
diff --git a/src/FbTk/Theme.hh b/src/FbTk/Theme.hh index 18348c2..c5d8e36 100644 --- a/src/FbTk/Theme.hh +++ b/src/FbTk/Theme.hh | |||
@@ -127,7 +127,7 @@ class ThemeManager { | |||
127 | public: | 127 | public: |
128 | static ThemeManager &instance(); | 128 | static ThemeManager &instance(); |
129 | /// load style file "filename" to screen | 129 | /// load style file "filename" to screen |
130 | bool load(const std::string &filename, int screen_num = -1); | 130 | bool load(const std::string &filename, const std::string &overlay_filename, int screen_num = -1); |
131 | std::string resourceValue(const std::string &name, const std::string &altname); | 131 | std::string resourceValue(const std::string &name, const std::string &altname); |
132 | void loadTheme(Theme &tm); | 132 | void loadTheme(Theme &tm); |
133 | bool loadItem(ThemeItem_base &resource); | 133 | bool loadItem(ThemeItem_base &resource); |
diff --git a/src/Screen.cc b/src/Screen.cc index 80c382f..c7fe1d3 100644 --- a/src/Screen.cc +++ b/src/Screen.cc | |||
@@ -358,6 +358,7 @@ BScreen::BScreen(FbTk::ResourceManager &rm, | |||
358 | // This must be fixed in the future. | 358 | // This must be fixed in the future. |
359 | m_root_theme->lock(true); | 359 | m_root_theme->lock(true); |
360 | FbTk::ThemeManager::instance().load(fluxbox->getStyleFilename(), | 360 | FbTk::ThemeManager::instance().load(fluxbox->getStyleFilename(), |
361 | fluxbox->getStyleOverlayFilename(), | ||
361 | m_root_theme->screenNum()); | 362 | m_root_theme->screenNum()); |
362 | m_root_theme->lock(false); | 363 | m_root_theme->lock(false); |
363 | m_root_theme->setLineAttributes(*resource.gc_line_width, | 364 | m_root_theme->setLineAttributes(*resource.gc_line_width, |
@@ -789,6 +790,7 @@ void BScreen::reconfigure() { | |||
789 | 790 | ||
790 | // Reload style | 791 | // Reload style |
791 | FbTk::ThemeManager::instance().load(fluxbox->getStyleFilename(), | 792 | FbTk::ThemeManager::instance().load(fluxbox->getStyleFilename(), |
793 | fluxbox->getStyleOverlayFilename(), | ||
792 | m_root_theme->screenNum()); | 794 | m_root_theme->screenNum()); |
793 | } | 795 | } |
794 | 796 | ||
diff --git a/src/fluxbox.cc b/src/fluxbox.cc index ef90d4e..94020f2 100644 --- a/src/fluxbox.cc +++ b/src/fluxbox.cc | |||
@@ -205,6 +205,7 @@ Fluxbox::Fluxbox(int argc, char **argv, const char *dpy_name, const char *rcfile | |||
205 | m_rc_numlayers(m_resourcemanager, 13, "session.numLayers", "Session.NumLayers"), | 205 | m_rc_numlayers(m_resourcemanager, 13, "session.numLayers", "Session.NumLayers"), |
206 | m_rc_double_click_interval(m_resourcemanager, 250, "session.doubleClickInterval", "Session.DoubleClickInterval"), | 206 | m_rc_double_click_interval(m_resourcemanager, 250, "session.doubleClickInterval", "Session.DoubleClickInterval"), |
207 | m_rc_stylefile(m_resourcemanager, DEFAULTSTYLE, "session.styleFile", "Session.StyleFile"), | 207 | m_rc_stylefile(m_resourcemanager, DEFAULTSTYLE, "session.styleFile", "Session.StyleFile"), |
208 | m_rc_styleoverlayfile(m_resourcemanager, "~/.fluxbox/ovrd_style", "session.styleOverlay", "Session.StyleOverlay"), | ||
208 | m_rc_menufile(m_resourcemanager, DEFAULTMENU, "session.menuFile", "Session.MenuFile"), | 209 | m_rc_menufile(m_resourcemanager, DEFAULTMENU, "session.menuFile", "Session.MenuFile"), |
209 | m_rc_keyfile(m_resourcemanager, DEFAULTKEYSFILE, "session.keyFile", "Session.KeyFile"), | 210 | m_rc_keyfile(m_resourcemanager, DEFAULTKEYSFILE, "session.keyFile", "Session.KeyFile"), |
210 | m_rc_slitlistfile(m_resourcemanager, "~/.fluxbox/slitlist", "session.slitlistFile", "Session.SlitlistFile"), | 211 | m_rc_slitlistfile(m_resourcemanager, "~/.fluxbox/slitlist", "session.slitlistFile", "Session.SlitlistFile"), |
@@ -299,7 +300,7 @@ Fluxbox::Fluxbox(int argc, char **argv, const char *dpy_name, const char *rcfile | |||
299 | 300 | ||
300 | load_rc(); | 301 | load_rc(); |
301 | // setup theme manager to have our style file ready to be scanned | 302 | // setup theme manager to have our style file ready to be scanned |
302 | FbTk::ThemeManager::instance().load(getStyleFilename()); | 303 | FbTk::ThemeManager::instance().load(getStyleFilename(), getStyleOverlayFilename()); |
303 | 304 | ||
304 | // setup atom handlers before we create any windows | 305 | // setup atom handlers before we create any windows |
305 | #ifdef REMEMBER | 306 | #ifdef REMEMBER |
@@ -377,9 +378,9 @@ Fluxbox::Fluxbox(int argc, char **argv, const char *dpy_name, const char *rcfile | |||
377 | } | 378 | } |
378 | 379 | ||
379 | m_keyscreen = m_mousescreen = m_screen_list.front(); | 380 | m_keyscreen = m_mousescreen = m_screen_list.front(); |
380 | 381 | ||
381 | // setup theme manager to have our style file ready to be scanned | 382 | // setup theme manager to have our style file ready to be scanned |
382 | FbTk::ThemeManager::instance().load(FbTk::StringUtil::expandFilename(getStyleFilename())); | 383 | FbTk::ThemeManager::instance().load(getStyleFilename(), getStyleOverlayFilename()); |
383 | 384 | ||
384 | //XSynchronize(disp, False); | 385 | //XSynchronize(disp, False); |
385 | sync(false); | 386 | sync(false); |
@@ -1587,7 +1588,7 @@ void Fluxbox::load_rc(BScreen &screen) { | |||
1587 | if (!(*it).empty() && (*it) != "") | 1588 | if (!(*it).empty() && (*it) != "") |
1588 | screen.addWorkspaceName((*it).c_str()); | 1589 | screen.addWorkspaceName((*it).c_str()); |
1589 | } | 1590 | } |
1590 | 1591 | ||
1591 | } | 1592 | } |
1592 | 1593 | ||
1593 | FbTk::Image::removeAllSearchPaths(); | 1594 | FbTk::Image::removeAllSearchPaths(); |
diff --git a/src/fluxbox.hh b/src/fluxbox.hh index 0da630d..c32e74b 100644 --- a/src/fluxbox.hh +++ b/src/fluxbox.hh | |||
@@ -80,54 +80,56 @@ class Fluxbox : public FbTk::App, | |||
80 | public FbTk::SignalEventHandler, | 80 | public FbTk::SignalEventHandler, |
81 | public FbTk::Observer { | 81 | public FbTk::Observer { |
82 | public: | 82 | public: |
83 | Fluxbox(int argc, char **argv, const char * dpy_name= 0, | 83 | Fluxbox(int argc, char **argv, const char * dpy_name= 0, |
84 | const char *rcfilename = 0); | 84 | const char *rcfilename = 0); |
85 | virtual ~Fluxbox(); | 85 | virtual ~Fluxbox(); |
86 | 86 | ||
87 | static Fluxbox *instance() { return s_singleton; } | 87 | static Fluxbox *instance() { return s_singleton; } |
88 | |||
88 | /// main event loop | 89 | /// main event loop |
89 | void eventLoop(); | 90 | void eventLoop(); |
90 | bool validateWindow(Window win) const; | 91 | bool validateWindow(Window win) const; |
91 | void grab(); | 92 | void grab(); |
92 | void ungrab(); | 93 | void ungrab(); |
93 | Keys *keys() { return m_key.get(); } | 94 | Keys *keys() { return m_key.get(); } |
94 | inline Atom getFluxboxPidAtom() const { return m_fluxbox_pid; } | 95 | Atom getFluxboxPidAtom() const { return m_fluxbox_pid; } |
95 | 96 | ||
96 | // Not currently implemented until we decide how it'll be used | 97 | // Not currently implemented until we decide how it'll be used |
97 | //WinClient *searchGroup(Window); | 98 | //WinClient *searchGroup(Window); |
98 | WinClient *searchWindow(Window); | 99 | WinClient *searchWindow(Window); |
99 | inline WinClient *getFocusedWindow() { return m_focused_window; } | 100 | WinClient *getFocusedWindow() { return m_focused_window; } |
100 | 101 | ||
101 | int initScreen(int screen_nr); | 102 | int initScreen(int screen_nr); |
102 | BScreen *searchScreen(Window w); | 103 | BScreen *searchScreen(Window w); |
103 | 104 | ||
104 | inline unsigned int getDoubleClickInterval() const { return *m_rc_double_click_interval; } | 105 | unsigned int getDoubleClickInterval() const { return *m_rc_double_click_interval; } |
105 | inline Time getLastTime() const { return m_last_time; } | 106 | Time getLastTime() const { return m_last_time; } |
106 | 107 | ||
107 | AtomHandler *getAtomHandler(const std::string &name); | 108 | AtomHandler *getAtomHandler(const std::string &name); |
108 | void addAtomHandler(AtomHandler *atomh, const std::string &name); | 109 | void addAtomHandler(AtomHandler *atomh, const std::string &name); |
109 | void removeAtomHandler(AtomHandler *atomh); | 110 | void removeAtomHandler(AtomHandler *atomh); |
110 | 111 | ||
111 | /// obsolete | 112 | /// obsolete |
112 | enum Titlebar{SHADE=0, MINIMIZE, MAXIMIZE, CLOSE, STICK, MENUICON, EMPTY}; | 113 | enum Titlebar{SHADE=0, MINIMIZE, MAXIMIZE, CLOSE, STICK, MENUICON, EMPTY}; |
113 | enum TabsAttachArea{ATTACH_AREA_WINDOW= 0, ATTACH_AREA_TITLEBAR}; | 114 | enum TabsAttachArea{ATTACH_AREA_WINDOW= 0, ATTACH_AREA_TITLEBAR}; |
114 | 115 | ||
115 | 116 | ||
116 | inline bool getIgnoreBorder() const { return *m_rc_ignoreborder; } | 117 | bool getIgnoreBorder() const { return *m_rc_ignoreborder; } |
117 | inline bool &getPseudoTrans() { return *m_rc_pseudotrans; } | 118 | bool &getPseudoTrans() { return *m_rc_pseudotrans; } |
118 | 119 | ||
119 | inline const std::vector<Fluxbox::Titlebar>& getTitlebarRight() const { return *m_rc_titlebar_right; } | 120 | const std::vector<Fluxbox::Titlebar>& getTitlebarRight() const { return *m_rc_titlebar_right; } |
120 | inline const std::vector<Fluxbox::Titlebar>& getTitlebarLeft() const { return *m_rc_titlebar_left; } | 121 | const std::vector<Fluxbox::Titlebar>& getTitlebarLeft() const { return *m_rc_titlebar_left; } |
121 | inline Fluxbox::TabsAttachArea getTabsAttachArea() const { return *m_rc_tabs_attach_area; } | 122 | Fluxbox::TabsAttachArea getTabsAttachArea() const { return *m_rc_tabs_attach_area; } |
122 | inline const std::string &getStyleFilename() const { return *m_rc_stylefile; } | 123 | const std::string &getStyleFilename() const { return *m_rc_stylefile; } |
124 | const std::string &getStyleOverlayFilename() const { return *m_rc_styleoverlayfile; } | ||
123 | 125 | ||
124 | inline const std::string &getMenuFilename() const { return *m_rc_menufile; } | 126 | const std::string &getMenuFilename() const { return *m_rc_menufile; } |
125 | inline const std::string &getSlitlistFilename() const { return *m_rc_slitlistfile; } | 127 | const std::string &getSlitlistFilename() const { return *m_rc_slitlistfile; } |
126 | inline const std::string &getAppsFilename() const { return *m_rc_appsfile; } | 128 | const std::string &getAppsFilename() const { return *m_rc_appsfile; } |
127 | inline int colorsPerChannel() const { return *m_rc_colors_per_channel; } | 129 | int colorsPerChannel() const { return *m_rc_colors_per_channel; } |
128 | inline int getNumberOfLayers() const { return *m_rc_numlayers; } | 130 | int getNumberOfLayers() const { return *m_rc_numlayers; } |
129 | inline int getTabsPadding() const { return *m_rc_tabs_padding; } | 131 | int getTabsPadding() const { return *m_rc_tabs_padding; } |
130 | inline int getFocusedTabMinWidth() const { return *m_rc_focused_tab_min_width; } | 132 | int getFocusedTabMinWidth() const { return *m_rc_focused_tab_min_width; } |
131 | 133 | ||
132 | // class to store layer numbers (special Resource type) | 134 | // class to store layer numbers (special Resource type) |
133 | // we have a special resource type because we need to be able to name certain layers | 135 | // we have a special resource type because we need to be able to name certain layers |
@@ -135,7 +137,7 @@ public: | |||
135 | class Layer { | 137 | class Layer { |
136 | public: | 138 | public: |
137 | explicit Layer(int i) : m_num(i) {}; | 139 | explicit Layer(int i) : m_num(i) {}; |
138 | inline int getNum() const { return m_num; } | 140 | int getNum() const { return m_num; } |
139 | 141 | ||
140 | Layer &operator=(int num) { m_num = num; return *this; } | 142 | Layer &operator=(int num) { m_num = num; return *this; } |
141 | 143 | ||
@@ -144,22 +146,22 @@ public: | |||
144 | }; | 146 | }; |
145 | 147 | ||
146 | // TODO these probably should be configurable | 148 | // TODO these probably should be configurable |
147 | inline int getMenuLayer() const { return 0; } | 149 | int getMenuLayer() const { return 0; } |
148 | inline int getAboveDockLayer() const { return 2; } | 150 | int getAboveDockLayer() const { return 2; } |
149 | inline int getDockLayer() const { return 4; } | 151 | int getDockLayer() const { return 4; } |
150 | inline int getTopLayer() const { return 6; } | 152 | int getTopLayer() const { return 6; } |
151 | inline int getNormalLayer() const { return 8; } | 153 | int getNormalLayer() const { return 8; } |
152 | inline int getBottomLayer() const { return 10; } | 154 | int getBottomLayer() const { return 10; } |
153 | inline int getDesktopLayer() const { return 12; } | 155 | int getDesktopLayer() const { return 12; } |
154 | 156 | ||
155 | 157 | ||
156 | inline time_t getAutoRaiseDelay() const { return *m_rc_auto_raise_delay; } | 158 | time_t getAutoRaiseDelay() const { return *m_rc_auto_raise_delay; } |
157 | 159 | ||
158 | inline unsigned int getCacheLife() const { return *m_rc_cache_life * 60000; } | 160 | unsigned int getCacheLife() const { return *m_rc_cache_life * 60000; } |
159 | inline unsigned int getCacheMax() const { return *m_rc_cache_max; } | 161 | unsigned int getCacheMax() const { return *m_rc_cache_max; } |
160 | inline bool useMod1() const { return *m_rc_use_mod1; } | 162 | bool useMod1() const { return *m_rc_use_mod1; } |
161 | 163 | ||
162 | inline void maskWindowEvents(Window w, FluxboxWindow *bw) | 164 | void maskWindowEvents(Window w, FluxboxWindow *bw) |
163 | { m_masked = w; m_masked_window = bw; } | 165 | { m_masked = w; m_masked_window = bw; } |
164 | 166 | ||
165 | void watchKeyRelease(BScreen &screen, unsigned int mods); | 167 | void watchKeyRelease(BScreen &screen, unsigned int mods); |
@@ -173,6 +175,7 @@ public: | |||
173 | void loadRootCommand(BScreen &scr); | 175 | void loadRootCommand(BScreen &scr); |
174 | void loadTitlebar(); | 176 | void loadTitlebar(); |
175 | void saveStyleFilename(const char *val) { m_rc_stylefile = (val == 0 ? "" : val); } | 177 | void saveStyleFilename(const char *val) { m_rc_stylefile = (val == 0 ? "" : val); } |
178 | void saveStyleOverlayFilename(const char *val) { m_rc_styleoverlayfile = (val == 0 ? "" : val); } | ||
176 | void saveMenuFilename(const char *); | 179 | void saveMenuFilename(const char *); |
177 | void clearMenuFilenames(); | 180 | void clearMenuFilenames(); |
178 | void saveTitlebarFilename(const char *); | 181 | void saveTitlebarFilename(const char *); |
@@ -247,7 +250,7 @@ private: | |||
247 | void handleButtonEvent(XButtonEvent &be); | 250 | void handleButtonEvent(XButtonEvent &be); |
248 | void handleUnmapNotify(XUnmapEvent &ue); | 251 | void handleUnmapNotify(XUnmapEvent &ue); |
249 | void handleClientMessage(XClientMessageEvent &ce); | 252 | void handleClientMessage(XClientMessageEvent &ce); |
250 | void handleKeyEvent(XKeyEvent &ke); | 253 | void handleKeyEvent(XKeyEvent &ke); |
251 | void setTitlebar(std::vector<Fluxbox::Titlebar>& dir, const char *arg); | 254 | void setTitlebar(std::vector<Fluxbox::Titlebar>& dir, const char *arg); |
252 | 255 | ||
253 | std::auto_ptr<FbAtoms> m_fbatoms; | 256 | std::auto_ptr<FbAtoms> m_fbatoms; |
@@ -263,6 +266,7 @@ private: | |||
263 | m_rc_tabs_padding, | 266 | m_rc_tabs_padding, |
264 | m_rc_focused_tab_min_width; | 267 | m_rc_focused_tab_min_width; |
265 | FbTk::Resource<std::string> m_rc_stylefile, | 268 | FbTk::Resource<std::string> m_rc_stylefile, |
269 | m_rc_styleoverlayfile, | ||
266 | m_rc_menufile, m_rc_keyfile, m_rc_slitlistfile, | 270 | m_rc_menufile, m_rc_keyfile, m_rc_slitlistfile, |
267 | m_rc_groupfile, m_rc_appsfile; | 271 | m_rc_groupfile, m_rc_appsfile; |
268 | 272 | ||
@@ -280,7 +284,7 @@ private: | |||
280 | // A window is the group leader, which can map to several | 284 | // A window is the group leader, which can map to several |
281 | // WinClients in the group, it is *not* fluxbox's concept of groups | 285 | // WinClients in the group, it is *not* fluxbox's concept of groups |
282 | // See ICCCM section 4.1.11 | 286 | // See ICCCM section 4.1.11 |
283 | // The group leader (which may not be mapped, so may not have a WinClient) | 287 | // The group leader (which may not be mapped, so may not have a WinClient) |
284 | // will have it's window being the group index | 288 | // will have it's window being the group index |
285 | std::multimap<Window, WinClient *> m_group_search; | 289 | std::multimap<Window, WinClient *> m_group_search; |
286 | 290 | ||