From 5ce35d9fa811358162ae44ee1ca514270d7da466 Mon Sep 17 00:00:00 2001
From: fluxgen <fluxgen>
Date: Thu, 27 Nov 2003 14:30:11 +0000
Subject: toggle pixmap for IconButton

---
 src/IconButton.cc  | 21 ++++++++++++++++-----
 src/IconButton.hh  |  9 +++++++--
 src/IconbarTool.cc | 26 +++++++++++++++++++++++---
 src/IconbarTool.hh |  3 ++-
 4 files changed, 48 insertions(+), 11 deletions(-)

diff --git a/src/IconButton.cc b/src/IconButton.cc
index 20fca8a..6c5e3e4 100644
--- a/src/IconButton.cc
+++ b/src/IconButton.cc
@@ -20,7 +20,7 @@
 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 // DEALINGS IN THE SOFTWARE.
 
-// $Id: IconButton.cc,v 1.12 2003/11/19 12:57:27 rathnor Exp $
+// $Id: IconButton.cc,v 1.13 2003/11/27 14:27:48 fluxgen Exp $
 
 #include "IconButton.hh"
 
@@ -66,7 +66,8 @@ IconButton::IconButton(const FbTk::FbWindow &parent, const FbTk::Font &font,
     FbTk::TextButton(parent, font, win.winClient().title()),
     m_win(win), 
     m_icon_window(*this, 1, 1, 1, 1, 
-                  ExposureMask | ButtonPressMask | ButtonReleaseMask) {
+                  ExposureMask | ButtonPressMask | ButtonReleaseMask),
+    m_use_pixmap(true) {
 
     FbTk::RefCount<FbTk::Command> focus(new FbTk::SimpleCommand<FluxboxWindow>(m_win, &FluxboxWindow::raiseAndFocus));
     FbTk::RefCount<FbTk::Command> menu(new ::ShowMenu(m_win));
@@ -117,6 +118,13 @@ void IconButton::clearArea(int x, int y,
                                 width, height, exposure);
 }
 
+void IconButton::setPixmap(bool use) {
+    if (m_use_pixmap != use) {
+        m_use_pixmap = use;
+        update(0);
+    }
+}
+
 void IconButton::update(FbTk::Subject *subj) {
     // we got signal that either title or 
     // icon pixmap was updated, 
@@ -130,7 +138,7 @@ void IconButton::update(FbTk::Subject *subj) {
     if (hints == 0)
         return;
 
-    if (hints->flags & IconPixmapHint && hints->icon_pixmap != 0) {
+    if (m_use_pixmap && (hints->flags & IconPixmapHint) && hints->icon_pixmap != 0) {
         // setup icon window
         m_icon_window.show();
         int new_height = height() - 2*m_icon_window.y(); // equally padded
@@ -148,7 +156,7 @@ void IconButton::update(FbTk::Subject *subj) {
         m_icon_pixmap = 0;
     }
 
-    if(hints->flags & IconMaskHint) {
+    if(m_use_pixmap && (hints->flags & IconMaskHint)) {
         m_icon_mask.copy(hints->icon_mask);
         m_icon_mask.scale(m_icon_pixmap.width(), m_icon_pixmap.height());
     } else
@@ -186,7 +194,10 @@ void IconButton::setupWindow() {
 
 void IconButton::drawText(int x, int y) {
     // offset text
-    FbTk::TextButton::drawText(m_icon_window.x() + m_icon_window.width() + 1, y);
+    if (m_icon_pixmap.drawable() != 0)
+        FbTk::TextButton::drawText(m_icon_window.x() + m_icon_window.width() + 1, y);
+    else
+        FbTk::TextButton::drawText(1, y);
 }
                           
 
diff --git a/src/IconButton.hh b/src/IconButton.hh
index 6ac08b7..69fbf46 100644
--- a/src/IconButton.hh
+++ b/src/IconButton.hh
@@ -20,7 +20,7 @@
 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 // DEALINGS IN THE SOFTWARE.
 
-// $Id: IconButton.hh,v 1.3 2003/09/10 21:40:01 fluxgen Exp $
+// $Id: IconButton.hh,v 1.4 2003/11/27 14:27:48 fluxgen Exp $
 
 #ifndef ICONBUTTON_HH
 #define ICONBUTTON_HH
@@ -33,7 +33,8 @@ class FluxboxWindow;
 
 class IconButton: public FbTk::TextButton, public FbTk::Observer {
 public:
-    IconButton(const FbTk::FbWindow &parent, const FbTk::Font &font, FluxboxWindow &window);
+    IconButton(const FbTk::FbWindow &parent, const FbTk::Font &font, 
+               FluxboxWindow &window);
     virtual ~IconButton();
 
     void exposeEvent(XExposeEvent &event);
@@ -46,8 +47,11 @@ public:
     void resize(unsigned int width, unsigned int height);
 
     void update(FbTk::Subject *subj);
+    void setPixmap(bool use);
+
     FluxboxWindow &win() { return m_win; }
     const FluxboxWindow &win() const { return m_win; }
+
 protected:
     void drawText(int x = 0, int y = 0);
 private:
@@ -57,6 +61,7 @@ private:
     FbTk::FbWindow m_icon_window;
     FbTk::FbPixmap m_icon_pixmap;
     FbTk::FbPixmap m_icon_mask;
+    bool m_use_pixmap;
 };
 
 #endif // ICONBUTTON_HH
diff --git a/src/IconbarTool.cc b/src/IconbarTool.cc
index 6bcc6b8..faccc62 100644
--- a/src/IconbarTool.cc
+++ b/src/IconbarTool.cc
@@ -20,7 +20,7 @@
 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 // DEALINGS IN THE SOFTWARE.
 
-// $Id: IconbarTool.cc,v 1.15 2003/10/26 20:13:11 fluxgen Exp $
+// $Id: IconbarTool.cc,v 1.16 2003/11/27 14:30:11 fluxgen Exp $
 
 #include "IconbarTool.hh"
 
@@ -31,12 +31,15 @@
 #include "Workspace.hh"
 #include "fluxbox.hh"
 #include "FbMenu.hh"
+#include "BoolMenuItem.hh"
+#include "CommandParser.hh"
 
 #include "FbTk/Menu.hh"
 #include "FbTk/MenuItem.hh"
 #include "FbTk/RefCount.hh"
 #include "FbTk/SimpleCommand.hh"
 #include "FbTk/ImageControl.hh"
+#include "FbTk/MacroCommand.hh"
 
 #include <typeinfo>
 #include <string>
@@ -181,11 +184,26 @@ IconbarTool::IconbarTool(const FbTk::FbWindow &parent, IconbarTheme &theme, BScr
     m_empty_pm(0),
     m_rc_mode(screen.resourceManager(), WORKSPACE,
               screen.name() + ".iconbar.mode", screen.altName() + ".Iconbar.Mode"),
+    m_rc_use_pixmap(screen.resourceManager(), true,
+                    screen.name() + ".iconbar.usePixmap", screen.altName() + ".Iconbar.UsePixmap"),
     m_menu(*screen.menuTheme(), menu.screenNumber(), screen.imageControl(),
            *screen.layerManager().getLayer(Fluxbox::instance()->getMenuLayer())) {
 
-    // setup menu
+    // setup mode menu
     setupModeMenu(m_menu, *this);
+
+    using namespace FbTk;
+    // setup use pixmap item to reconfig iconbar and save resource on click
+    MacroCommand *save_and_reconfig = new MacroCommand();   
+    RefCount<Command> reconfig(new SimpleCommand<IconbarTool>(*this, &IconbarTool::renderTheme));
+    RefCount<Command> save(CommandParser::instance().parseLine("saverc"));
+    save_and_reconfig->add(reconfig);
+    save_and_reconfig->add(save);
+    RefCount<Command> s_and_reconfig(save_and_reconfig);
+    m_menu.insert(new BoolMenuItem("Use Pixmap", *m_rc_use_pixmap, s_and_reconfig));
+    m_menu.update();
+
+    // add iconbar menu to toolbar menu
     menu.insert(m_menu.label().c_str(), &m_menu);
 
     // setup signals
@@ -445,6 +463,8 @@ void IconbarTool::renderTheme() {
 
 void IconbarTool::renderButton(IconButton &button) {
 
+    button.setPixmap(*m_rc_use_pixmap);
+
     if (button.win().isFocused()) { // focused texture
         button.setGC(m_theme.focusedText().textGC());     
         button.setFont(m_theme.focusedText().font());
@@ -517,6 +537,7 @@ void IconbarTool::addWindow(FluxboxWindow &win) {
         return;
 
     IconButton *button = new IconButton(m_icon_container, m_theme.focusedText().font(), win);
+    button->setPixmap(*m_rc_use_pixmap);
     m_icon_container.insertItem(button);    
     m_icon_list.push_back(button);
 
@@ -527,7 +548,6 @@ void IconbarTool::addWindow(FluxboxWindow &win) {
     win.stateSig().attach(this);
 }
 
-
 void IconbarTool::updateIcons() {
     std::list<FluxboxWindow *> itemlist;
     // add icons to the itemlist    
diff --git a/src/IconbarTool.hh b/src/IconbarTool.hh
index c805fec..00e1026 100644
--- a/src/IconbarTool.hh
+++ b/src/IconbarTool.hh
@@ -20,7 +20,7 @@
 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 // DEALINGS IN THE SOFTWARE.
 
-// $Id: IconbarTool.hh,v 1.9 2003/10/06 06:22:42 rathnor Exp $
+// $Id: IconbarTool.hh,v 1.10 2003/11/27 14:30:11 fluxgen Exp $
 
 #ifndef ICONBARTOOL_HH
 #define ICONBARTOOL_HH
@@ -108,6 +108,7 @@ private:
 
     IconList m_icon_list;
     FbTk::Resource<Mode> m_rc_mode;
+    FbTk::Resource<bool> m_rc_use_pixmap; ///< if iconbar should use win pixmap or not
 
     FbMenu m_menu;
 };
-- 
cgit v0.11.2