aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/IconbarTool.cc114
-rw-r--r--src/IconbarTool.hh12
2 files changed, 89 insertions, 37 deletions
diff --git a/src/IconbarTool.cc b/src/IconbarTool.cc
index 26dd8da..6e4b8ae 100644
--- a/src/IconbarTool.cc
+++ b/src/IconbarTool.cc
@@ -20,7 +20,7 @@
20// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 20// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21// DEALINGS IN THE SOFTWARE. 21// DEALINGS IN THE SOFTWARE.
22 22
23// $Id: IconbarTool.cc,v 1.1 2003/08/11 15:42:29 fluxgen Exp $ 23// $Id: IconbarTool.cc,v 1.2 2003/08/12 00:19:14 fluxgen Exp $
24 24
25#include "IconbarTool.hh" 25#include "IconbarTool.hh"
26 26
@@ -29,6 +29,7 @@
29#include "IconbarTheme.hh" 29#include "IconbarTheme.hh"
30#include "Window.hh" 30#include "Window.hh"
31#include "IconButton.hh" 31#include "IconButton.hh"
32#include "Workspace.hh"
32 33
33#include <iostream> 34#include <iostream>
34using namespace std; 35using namespace std;
@@ -42,39 +43,36 @@ IconbarTool::IconbarTool(const FbTk::FbWindow &parent, IconbarTheme &theme, BScr
42 ToolbarItem(ToolbarItem::RELATIVE), 43 ToolbarItem(ToolbarItem::RELATIVE),
43 m_screen(screen), 44 m_screen(screen),
44 m_icon_container(parent), 45 m_icon_container(parent),
45 m_theme(theme) { 46 m_theme(theme),
47 m_focused_pm(0),
48 m_unfocused_pm(0),
49 m_empty_pm(0) {
46 50
47 theme.reconfigSig().attach(this); 51 theme.reconfigSig().attach(this);
52
48 screen.clientListSig().attach(this); 53 screen.clientListSig().attach(this);
54 screen.currentWorkspaceSig().attach(this);
49 55
50 // for debug 56 update(0);
51 /* FbTk::RefCount<FbTk::Command> show_text(new ShowTextCmd());
52 FbTk::Button *button = new TextButton(m_icon_container, theme.focusedText().font(), "ONE WINDOW");
53 button->setOnClick(show_text);
54 button->setGC(theme.focusedText().textGC());
55 button->setBackgroundColor(theme.focusedTexture().color());
56 button->clear();
57 m_icon_container.insertItem(button);
58
59 button = new TextButton(m_icon_container, theme.focusedText().font(), "ONE WINDOW");
60 button->setOnClick(show_text);
61 button->setGC(theme.focusedText().textGC());
62 button->setBackgroundColor(theme.focusedTexture().color());
63 button->clear();
64 m_icon_container.insertItem(button);
65
66 button = new TextButton(m_icon_container, theme.focusedText().font(), "ONE WINDOW");
67 button->setOnClick(show_text);
68 button->setGC(theme.focusedText().textGC());
69 button->setBackgroundColor(theme.focusedTexture().color());
70 button->clear();
71 m_icon_container.insertItem(button);
72
73 m_icon_container.showSubwindows();
74 */
75 renderTheme(); 57 renderTheme();
76} 58}
77 59
60IconbarTool::~IconbarTool() {
61 while (!m_icon_list.empty()) {
62 delete m_icon_list.back();
63 m_icon_list.pop_back();
64 }
65
66 // remove cached images
67 if (m_focused_pm)
68 m_screen.imageControl().removeImage(m_focused_pm);
69 if (m_unfocused_pm)
70 m_screen.imageControl().removeImage(m_focused_pm);
71 if (m_empty_pm)
72 m_screen.imageControl().removeImage(m_empty_pm);
73
74}
75
78void IconbarTool::move(int x, int y) { 76void IconbarTool::move(int x, int y) {
79 m_icon_container.move(x, y); 77 m_icon_container.move(x, y);
80} 78}
@@ -108,6 +106,41 @@ unsigned int IconbarTool::height() const {
108} 106}
109 107
110void IconbarTool::update(FbTk::Subject *subj) { 108void IconbarTool::update(FbTk::Subject *subj) {
109 // just focus signal?
110 if (subj != 0 && typeid(*subj) == typeid(FluxboxWindow::WinSubject)) {
111 renderTheme();
112 return;
113 }
114
115 // ok, we got some signal that we need to update our iconbar container
116
117 // remove all clients and add them again...the only way to do it now
118 m_icon_container.removeAll();
119
120 while (!m_icon_list.empty()) {
121 delete m_icon_list.back();
122 m_icon_list.pop_back();
123 }
124
125 // get current workspace and all it's clients
126 Workspace &space = *m_screen.currentWorkspace();
127 // build a ItemList and add it (faster than adding single items)
128 Container::ItemList items;
129 Workspace::Windows::iterator it = space.windowList().begin();
130 Workspace::Windows::iterator it_end = space.windowList().end();
131 for (; it != it_end; ++it) {
132 // we just want windows that has clients
133 if ((*it)->clientList().size() == 0)
134 continue;
135
136 IconButton *button = new IconButton(m_icon_container, m_theme.focusedText().font(), **it);
137 items.push_back(button);
138 m_icon_list.push_back(button);
139 (*it)->focusSig().attach(this);
140 }
141
142 m_icon_container.showSubwindows();
143 m_icon_container.insertItems(items);
111 144
112 renderTheme(); 145 renderTheme();
113} 146}
@@ -118,7 +151,7 @@ void IconbarTool::renderTheme() {
118 m_focused_pm = 0; 151 m_focused_pm = 0;
119 } else { 152 } else {
120 m_focused_pm = m_screen.imageControl().renderImage(m_icon_container.maxWidthPerClient(), 153 m_focused_pm = m_screen.imageControl().renderImage(m_icon_container.maxWidthPerClient(),
121 m_icon_container.maxHeightPerClient(), 154 m_icon_container.height(),
122 m_theme.focusedTexture()); 155 m_theme.focusedTexture());
123 } 156 }
124 157
@@ -130,19 +163,34 @@ void IconbarTool::renderTheme() {
130 m_unfocused_pm = 0; 163 m_unfocused_pm = 0;
131 } else { 164 } else {
132 m_unfocused_pm = m_screen.imageControl().renderImage(m_icon_container.maxWidthPerClient(), 165 m_unfocused_pm = m_screen.imageControl().renderImage(m_icon_container.maxWidthPerClient(),
133 m_icon_container.maxHeightPerClient(), 166 m_icon_container.height(),
134 m_theme.unfocusedTexture()); 167 m_theme.unfocusedTexture());
135 } 168 }
136 if (tmp) 169 if (tmp)
137 m_screen.imageControl().removeImage(tmp); 170 m_screen.imageControl().removeImage(tmp);
138 171
172 // if we dont have any icons then we should render empty texture
173 tmp = m_empty_pm;
174 if (m_theme.emptyTexture().type() == (FbTk::Texture::FLAT | FbTk::Texture::SOLID)) {
175 m_empty_pm = 0;
176 m_icon_container.setBackgroundColor(m_theme.emptyTexture().color());
177 } else {
178 m_empty_pm = m_screen.imageControl().renderImage(m_icon_container.width(), m_icon_container.height(),
179 m_theme.emptyTexture());
180 m_icon_container.setBackgroundPixmap(m_empty_pm);
181 }
182
183 if (tmp)
184 m_screen.imageControl().removeImage(m_empty_pm);
139 185
140 // update buttons 186 // update buttons
141 Icon2WinMap::iterator icon_it = m_icon2winmap.begin(); 187 IconList::iterator icon_it = m_icon_list.begin();
142 Icon2WinMap::iterator icon_it_end = m_icon2winmap.end(); 188 IconList::iterator icon_it_end = m_icon_list.end();
143 for (; icon_it != icon_it_end; ++icon_it) { 189 for (; icon_it != icon_it_end; ++icon_it) {
144 IconButton &button = *(*icon_it).second; 190
145 if (button.win().isFocused()) { 191 IconButton &button = *(*icon_it);
192
193 if (button.win().isFocused()) { // focused texture
146 button.setGC(m_theme.focusedText().textGC()); 194 button.setGC(m_theme.focusedText().textGC());
147 button.setFont(m_theme.focusedText().font()); 195 button.setFont(m_theme.focusedText().font());
148 button.setJustify(m_theme.focusedText().justify()); 196 button.setJustify(m_theme.focusedText().justify());
diff --git a/src/IconbarTool.hh b/src/IconbarTool.hh
index 6711324..31c6f24 100644
--- a/src/IconbarTool.hh
+++ b/src/IconbarTool.hh
@@ -20,7 +20,7 @@
20// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 20// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21// DEALINGS IN THE SOFTWARE. 21// DEALINGS IN THE SOFTWARE.
22 22
23// $Id: IconbarTool.hh,v 1.1 2003/08/11 15:42:29 fluxgen Exp $ 23// $Id: IconbarTool.hh,v 1.2 2003/08/12 00:18:43 fluxgen Exp $
24 24
25#ifndef ICONBARTOOL_HH 25#ifndef ICONBARTOOL_HH
26#define ICONBARTOOL_HH 26#define ICONBARTOOL_HH
@@ -30,7 +30,7 @@
30 30
31#include "FbTk/Observer.hh" 31#include "FbTk/Observer.hh"
32 32
33#include <map> 33#include <list>
34 34
35#include <X11/Xlib.h> 35#include <X11/Xlib.h>
36 36
@@ -42,6 +42,8 @@ class FluxboxWindow;
42class IconbarTool: public ToolbarItem, public FbTk::Observer { 42class IconbarTool: public ToolbarItem, public FbTk::Observer {
43public: 43public:
44 IconbarTool(const FbTk::FbWindow &parent, IconbarTheme &theme, BScreen &screen); 44 IconbarTool(const FbTk::FbWindow &parent, IconbarTheme &theme, BScreen &screen);
45 ~IconbarTool();
46
45 void move(int x, int y); 47 void move(int x, int y);
46 void resize(unsigned int width, unsigned int height); 48 void resize(unsigned int width, unsigned int height);
47 void moveResize(int x, int y, 49 void moveResize(int x, int y,
@@ -59,10 +61,12 @@ private:
59 BScreen &m_screen; 61 BScreen &m_screen;
60 Container m_icon_container; 62 Container m_icon_container;
61 const IconbarTheme &m_theme; 63 const IconbarTheme &m_theme;
64 // cached pixmaps
62 Pixmap m_focused_pm, m_unfocused_pm; 65 Pixmap m_focused_pm, m_unfocused_pm;
66 Pixmap m_empty_pm; ///< pixmap for empty container
63 67
64 typedef std::map<FluxboxWindow *, IconButton *> Icon2WinMap; 68 typedef std::list<IconButton *> IconList;
65 Icon2WinMap m_icon2winmap; 69 IconList m_icon_list;
66}; 70};
67 71
68#endif // ICONBARTOOL_HH 72#endif // ICONBARTOOL_HH