Index: src/IconButton.cc =================================================================== RCS file: /cvsroot/fluxbox/fluxbox/src/IconButton.cc,v retrieving revision 1.22 diff -a -b -B -p -u -r1.22 IconButton.cc --- src/IconButton.cc 15 Jul 2004 14:20:19 -0000 1.22 +++ src/IconButton.cc 4 Aug 2004 23:12:09 -0000 @@ -23,7 +23,7 @@ // $Id: IconButton.cc,v 1.22 2004/07/15 14:20:19 fluxgen Exp $ #include "IconButton.hh" - +#include "IconbarTool.hh" #include "fluxbox.hh" #include "Screen.hh" @@ -49,6 +49,8 @@ #include #endif // SHAPE +typedef FbTk::RefCount RefCmd; + namespace { class ShowMenu: public FbTk::Command { @@ -69,10 +71,19 @@ private: class FocusCommand: public FbTk::Command { public: - explicit FocusCommand(FluxboxWindow &win):m_win(win) { } + explicit FocusCommand(const IconbarTool& tool, FluxboxWindow &win) : + m_win(win), m_tool(tool) { } void execute() { if(m_win.isIconic() || !m_win.isFocused()) { + switch(m_tool.deiconifyMode()) { + case IconbarTool::CURRENT: + m_win.screen().sendToWorkspace(m_win.screen().currentWorkspaceID(), &m_win); + break; + case IconbarTool::FOLLOW: m_win.screen().changeWorkspaceID(m_win.workspaceNumber()); + break; + }; + m_win.raiseAndFocus(); } else m_win.iconify(); @@ -77,39 +88,72 @@ public: } else m_win.iconify(); } + private: FluxboxWindow &m_win; + const IconbarTool& m_tool; }; +// simple forwarding of wheeling, but only +// if desktopwheeling is enabled +class WheelWorkspaceCmd : public FbTk::Command { +public: + explicit WheelWorkspaceCmd(const IconbarTool& tool, FluxboxWindow &win, const char* cmd) : + m_win(win), m_tool(tool), m_cmd(CommandParser::instance().parseLine(cmd)){ } + void execute() { + + switch(m_tool.wheelMode()) { + case IconbarTool::ON: + m_cmd->execute(); + break; + case IconbarTool::SCREEN: + if(m_win.screen().isDesktopWheeling()) + m_cmd->execute(); + break; + case IconbarTool::OFF: + default: + break; + }; + } + +private: + FluxboxWindow &m_win; + RefCmd m_cmd; + const IconbarTool& m_tool; +}; } // end anonymous namespace -IconButton::IconButton(const FbTk::FbWindow &parent, const FbTk::Font &font, - FluxboxWindow &win): +IconButton::IconButton(const IconbarTool& tool, const FbTk::FbWindow &parent, + const FbTk::Font &font, FluxboxWindow &win): FbTk::TextButton(parent, font, win.winClient().title()), m_win(win), m_icon_window(*this, 1, 1, 1, 1, ExposureMask | ButtonPressMask | ButtonReleaseMask), m_use_pixmap(true) { - typedef FbTk::RefCount RefCmd; - RefCmd hidemenus(new FbTk::SimpleCommand(win.screen(), &BScreen::hideMenus)); - RefCmd next_workspace(CommandParser::instance().parseLine("nextworkspace")); - RefCmd prev_workspace(CommandParser::instance().parseLine("prevworkspace")); + + RefCmd next_workspace(new ::WheelWorkspaceCmd(tool, m_win, "nextworkspace")); + RefCmd prev_workspace(new ::WheelWorkspaceCmd(tool, m_win, "prevworkspace")); + //!! TODO: There're some issues with MacroCommand when // this object dies when the last macrocommand is executed (focused cmd) // In iconbar mode Icons + // + // RefCmd hidemenus(new FbTk::SimpleCommand(win.screen(), &BScreen::hideMenus)); // FbTk::MacroCommand *focus_macro = new FbTk::MacroCommand(); // focus_macro->add(hidemenus); // focus_macro->add(focus); - FbTk::RefCount focus_cmd(new ::FocusCommand(m_win)); - FbTk::RefCount menu_cmd(new ::ShowMenu(m_win)); + + RefCmd focus_cmd(new ::FocusCommand(tool, m_win)); + RefCmd menu_cmd(new ::ShowMenu(m_win)); setOnClick(focus_cmd, 1); setOnClick(menu_cmd, 3); setOnClick(next_workspace, 4); setOnClick(prev_workspace, 5); + m_win.hintSig().attach(this); FbTk::EventManager::instance()->add(*this, m_icon_window); Index: src/IconButton.hh =================================================================== RCS file: /cvsroot/fluxbox/fluxbox/src/IconButton.hh,v retrieving revision 1.4 diff -a -b -B -p -u -r1.4 IconButton.hh --- src/IconButton.hh 27 Nov 2003 14:27:48 -0000 1.4 +++ src/IconButton.hh 4 Aug 2004 23:12:09 -0000 @@ -30,11 +30,12 @@ #include "FbTk/TextButton.hh" class FluxboxWindow; +class IconbarTool; class IconButton: public FbTk::TextButton, public FbTk::Observer { public: - IconButton(const FbTk::FbWindow &parent, const FbTk::Font &font, - FluxboxWindow &window); + IconButton(const IconbarTool& tool, const FbTk::FbWindow &parent, + const FbTk::Font &font, FluxboxWindow &window); virtual ~IconButton(); void exposeEvent(XExposeEvent &event); Index: src/IconbarTool.cc =================================================================== RCS file: /cvsroot/fluxbox/fluxbox/src/IconbarTool.cc,v retrieving revision 1.41 diff -a -b -B -p -u -r1.41 IconbarTool.cc --- src/IconbarTool.cc 27 Jun 2004 13:45:20 -0000 1.41 +++ src/IconbarTool.cc 4 Aug 2004 23:12:10 -0000 @@ -66,6 +66,69 @@ void FbTk::Resource:: } template<> +void FbTk::Resource::setDefaultValue() { + m_value = IconbarTool::CURRENT; +} + +template<> +void FbTk::Resource::setFromString(const char* strval) { + if (strncasecmp(strval, "current", strlen("current")) == 0) + m_value == IconbarTool::CURRENT; + else if (strncasecmp(strval, "follow", strlen("follow")) == 0) + m_value == IconbarTool::FOLLOW; + else + setDefaultValue(); +} + +template<> +std::string FbTk::Resource::getString() { + switch (m_value) { + case IconbarTool::SCREEN: + return std::string("screen"); + break; + case IconbarTool::FOLLOW: + return std::string("follow"); + break; + }; + return std::string("screen"); +} + +template<> +void FbTk::Resource::setDefaultValue() { + m_value = IconbarTool::SCREEN; +} + + +template<> +void FbTk::Resource::setFromString(const char* strval) { + if (strncasecmp(strval, "off", strlen("off")) == 0) + m_value = IconbarTool::OFF; + else if (strncasecmp(strval, "on", strlen("on")) == 0) + m_value = IconbarTool::ON; + else if (strncasecmp(strval, "screen", strlen("screen")) == 0) + m_value = IconbarTool::SCREEN; + else + setDefaultValue(); +} + + +template<> +std::string FbTk::Resource::getString() { + switch(m_value) { + case IconbarTool::OFF: + return std::string("off"); + break; + case IconbarTool::ON: + return std::string("on"); + break; + case IconbarTool::SCREEN: + return std::string("screen"); + break; + }; + return std::string("off"); +} + +template<> void FbTk::Resource::setDefaultValue() { m_value = Container::RELATIVE; } @@ -275,6 +338,12 @@ IconbarTool::IconbarTool(const FbTk::FbW m_empty_pm(0), m_rc_mode(screen.resourceManager(), WORKSPACE, screen.name() + ".iconbar.mode", screen.altName() + ".Iconbar.Mode"), + m_deiconify_mode(screen.resourceManager(), CURRENT, + screen.name() + ".iconbar.deiconifyMode", + screen.name() + ".iconbar.DeiconifyMode"), + m_wheel_mode(screen.resourceManager(), OFF, + screen.name() + ".iconbar.wheelMode", + screen.name() + ".iconbar.WheelMode"), m_rc_alignment(screen.resourceManager(), Container::LEFT, screen.name() + ".iconbar.alignment", screen.altName() + ".Iconbar.Alignment"), m_rc_client_width(screen.resourceManager(), 70, @@ -400,6 +470,20 @@ void IconbarTool::setMode(Mode mode) { renderTheme(); } +void IconbarTool::setDeiconifyMode(DeiconifyMode mode) { + if (mode == *m_deiconify_mode) + return; + + *m_deiconify_mode = mode; +} + +void IconbarTool::setWheelMode(WheelMode mode) { + if (mode == *m_wheel_mode) + return; + *m_wheel_mode = mode; +} + + unsigned int IconbarTool::width() const { return m_icon_container.width(); } @@ -712,7 +796,10 @@ void IconbarTool::addWindow(FluxboxWindo if (win.clientList().empty() || win.isIconHidden() ) return; - IconButton *button = new IconButton(m_icon_container, m_theme.focusedText().font(), win); + IconButton *button = new IconButton(*this, + m_icon_container, + m_theme.focusedText().font(), + win); renderButton(*button, false); // update the attributes, but don't clear it m_icon_container.insertItem(button); Index: src/IconbarTool.hh =================================================================== RCS file: /cvsroot/fluxbox/fluxbox/src/IconbarTool.hh,v retrieving revision 1.14 diff -a -b -B -p -u -r1.14 IconbarTool.hh --- src/IconbarTool.hh 16 Jun 2004 15:38:19 -0000 1.14 +++ src/IconbarTool.hh 4 Aug 2004 23:12:11 -0000 @@ -54,6 +54,19 @@ public: ALLWINDOWS ///< all windows and all icons from all workspaces }; + /// deiconfiy mode for iconbuttons + enum DeiconifyMode { + CURRENT, ///< raise the window on the current workspace + FOLLOW, ///< raise the window on the workspace it was iconified from + }; + + /// wheeling on iconbutton + enum WheelMode { + OFF, ///< no wheeling, default mode + ON, ///< enabled wheeling + SCREEN ///< same as desktopwheeling + }; + IconbarTool(const FbTk::FbWindow &parent, IconbarTheme &theme, BScreen &screen, FbTk::Menu &menu); ~IconbarTool(); @@ -68,12 +81,17 @@ public: void hide(); void setAlignment(Container::Alignment a); void setMode(Mode mode); + void setDeiconifyMode(DeiconifyMode mode); + void setWheelMode(WheelMode mode); unsigned int width() const; unsigned int height() const; unsigned int borderWidth() const; Mode mode() const { return *m_rc_mode; } + DeiconifyMode deiconifyMode() const { return *m_deiconify_mode; } + WheelMode wheelMode() const { return *m_wheel_mode; } + Container::Alignment alignment() const { return m_icon_container.alignment(); } private: /// @return button associated with window @@ -114,6 +132,8 @@ private: IconList m_icon_list; FbTk::Resource m_rc_mode; + FbTk::Resource m_deiconify_mode; + FbTk::Resource m_wheel_mode; FbTk::Resource m_rc_alignment; ///< alignment of buttons FbTk::Resource m_rc_client_width; ///< size of client button in LEFT/RIGHT mode FbTk::Resource m_rc_use_pixmap; ///< if iconbar should use win pixmap or not