all repos — fluxbox @ b5c354b994bc06667abe35e2d528c0f025703c4e

custom fork of the fluxbox windowmanager

architecture astronomy
Mark Tiefenbruck mark@fluxbox.org
commit

b5c354b994bc06667abe35e2d528c0f025703c4e

parent

1f5cd12facc662de240b36bf3c5c14f40adf391b

M src/AlphaMenu.ccsrc/AlphaMenu.cc

@@ -25,23 +25,26 @@

#include "AlphaMenu.hh" #include "Window.hh" +#include "WindowCmd.hh" #include "Screen.hh" #include "Workspace.hh" #include "WindowCmd.hh" #include "fluxbox.hh" #include "Layer.hh" -#include "IntResMenuItem.hh" +#include "FbTk/IntMenuItem.hh" #include "FbTk/I18n.hh" #include "Window.hh" -#include "WindowCmd.hh" AlphaMenu::AlphaMenu(MenuTheme &tm, FbTk::ImageControl &imgctrl, - FbTk::XLayer &layer, AlphaObject &object): - ToggleMenu(tm, imgctrl, layer), - m_focused_alpha_resource(&object, &AlphaObject::getFocusedAlpha, &AlphaObject::setFocusedAlpha, 255), - m_unfocused_alpha_resource(&object, &AlphaObject::getUnfocusedAlpha, &AlphaObject::setUnfocusedAlpha, 255) + FbTk::XLayer &layer): + ToggleMenu(tm, imgctrl, layer) { + + static WindowAccessor<int> m_focused_alpha((WindowAccessor<int>::Getter)&FluxboxWindow::getFocusedAlpha, + (WindowAccessor<int>::Setter)&FluxboxWindow::setFocusedAlpha, 255); + static WindowAccessor<int> m_unfocused_alpha((WindowAccessor<int>::Getter)&FluxboxWindow::getUnfocusedAlpha, + (WindowAccessor<int>::Setter)&FluxboxWindow::setUnfocusedAlpha, 255); _FB_USES_NLS;

@@ -53,7 +56,7 @@ "Focused Window Alpha",

"Transparency level of the focused window"); FbTk::MenuItem *focused_alpha_item = - new IntResMenuItem< ObjectResource<AlphaObject, int> >(focused_alpha_label, m_focused_alpha_resource, 0, 255, *this); + new FbTk::IntMenuItem(focused_alpha_label, m_focused_alpha, 0, 255, *this); insert(focused_alpha_item); const FbTk::FbString unfocused_alpha_label =

@@ -62,14 +65,14 @@ "Unfocused Window Alpha",

"Transparency level of unfocused windows"); FbTk::MenuItem *unfocused_alpha_item = - new IntResMenuItem< ObjectResource<AlphaObject, int> >(unfocused_alpha_label, m_unfocused_alpha_resource, 0, 255, *this); + new FbTk::IntMenuItem(unfocused_alpha_label, m_unfocused_alpha, 0, 255, *this); insert(unfocused_alpha_item); const FbTk::FbString usedefault_label = _FB_XTEXT(Windowmenu, DefaultAlpha, "Use Defaults", "Default transparency settings for this window"); FbTk::MenuItem *usedefault_item = - new AlphaMenuSelectItem(usedefault_label, &object, *this); + new AlphaMenuSelectItem(usedefault_label, *this); insert(usedefault_item); updateMenu();

@@ -81,8 +84,8 @@ FbTk::Menu::move(x, y);

if (isVisible()) { // TODO: hardcoding the indices is a bad idea - ((IntResMenuItem< ObjectResource<AlphaObject, int> >*)find(0))->updateLabel(); - ((IntResMenuItem< ObjectResource<AlphaObject, int> >*)find(1))->updateLabel(); + ((FbTk::IntMenuItem *)find(0))->updateLabel(); + ((FbTk::IntMenuItem *)find(1))->updateLabel(); frameWindow().updateBackground(false); FbTk::Menu::clearWindow(); }

@@ -90,8 +93,8 @@ }

void AlphaMenu::show() { // TODO: hardcoding the indices is a bad idea - ((IntResMenuItem< ObjectResource<AlphaObject, int> >*)find(0))->updateLabel(); - ((IntResMenuItem< ObjectResource<AlphaObject, int> >*)find(1))->updateLabel(); + ((FbTk::IntMenuItem *)find(0))->updateLabel(); + ((FbTk::IntMenuItem *)find(1))->updateLabel(); frameWindow().updateBackground(false); FbTk::Menu::clearWindow();
M src/AlphaMenu.hhsrc/AlphaMenu.hh

@@ -26,56 +26,40 @@ #ifndef ALPHAMENU_HH

#define ALPHAMENU_HH #include "ToggleMenu.hh" +#include "WindowCmd.hh" #include "FbTk/MenuItem.hh" -#include "ObjectResource.hh" - -class AlphaObject { -public: - - virtual int getFocusedAlpha() const = 0; - virtual int getUnfocusedAlpha() const = 0; - virtual bool getUseDefaultAlpha() const = 0; - - virtual void setFocusedAlpha(int alpha) = 0; - virtual void setUnfocusedAlpha(int alpha) = 0; - virtual void setDefaultAlpha() = 0; - - virtual ~AlphaObject() {}; -}; - class AlphaMenu : public ToggleMenu { public: AlphaMenu(MenuTheme &tm, FbTk::ImageControl &imgctrl, - FbTk::XLayer &layer, AlphaObject &object); + FbTk::XLayer &layer); // we override these to update the menu when the active window changes void move(int x, int y); void show(); - - ObjectResource<AlphaObject, int> m_focused_alpha_resource; - ObjectResource<AlphaObject, int> m_unfocused_alpha_resource; - }; class AlphaMenuSelectItem : public FbTk::MenuItem { public: - AlphaMenuSelectItem(const FbTk::FbString &label, AlphaObject *object, AlphaMenu &parent): - FbTk::MenuItem(label), m_object(object), m_parent(parent) { + AlphaMenuSelectItem(const FbTk::FbString &label, AlphaMenu &parent): + FbTk::MenuItem(label), m_parent(parent) { setToggleItem(true); setCloseOnClick(false); } - bool isSelected() const { return m_object->getUseDefaultAlpha(); } + bool isSelected() const { + static ConstWindowAccessor<bool> s_is_default(&FluxboxWindow::getUseDefaultAlpha, true); + return s_is_default; + } void click(int button, int time, unsigned int mods) { - m_object->setDefaultAlpha(); + static WindowCmd<void> s_set_default(&FluxboxWindow::setDefaultAlpha); + s_set_default.execute(); m_parent.show(); // cheat to refreshing the window FbTk::MenuItem::click(button, time, mods); } private: - AlphaObject *m_object; AlphaMenu &m_parent; };
D src/BoolMenuItem.hh

@@ -1,90 +0,0 @@

-// BoolMenuItem.hh for Fluxbox Window Manager -// Copyright (c) 2003 - 2006 Henrik Kinnunen (fluxgen at fluxbox dot org) -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the "Software"), -// to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, -// and/or sell copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -// DEALINGS IN THE SOFTWARE. - -// $Id$ - -#ifndef BOOLMENUITEM_HH -#define BOOLMENUITEM_HH - -#include "MenuItem.hh" - -/// a bool menu item -class BoolMenuItem: public FbTk::MenuItem { -public: - BoolMenuItem(const FbTk::FbString &label, bool &item, - FbTk::RefCount<FbTk::Command> &cmd): - FbTk::MenuItem(label, cmd), m_item(item) { - FbTk::MenuItem::setSelected(m_item); - setToggleItem(true); - setCloseOnClick(false); - } - BoolMenuItem(const FbTk::FbString &label, bool &item): - FbTk::MenuItem(label), m_item(item) { - FbTk::MenuItem::setSelected(m_item); - setToggleItem(true); - setCloseOnClick(false); - } - bool isSelected() const { return m_item; } - // toggle state - void click(int button, int time, unsigned int mods) { - setSelected(!m_item); - FbTk::MenuItem::click(button, time, mods); - } - void setSelected(bool value) { - m_item = value; - FbTk::MenuItem::setSelected(m_item); - } -private: - bool &m_item; -}; - -/// a bool menu item -template <typename Type> -class BoolResMenuItem: public FbTk::MenuItem { -public: - BoolResMenuItem(const FbTk::FbString &label, Type &res, - FbTk::RefCount<FbTk::Command> &cmd): - FbTk::MenuItem(label, cmd), m_res(res) { - FbTk::MenuItem::setSelected(*m_res); - setToggleItem(true); - setCloseOnClick(false); - } - BoolResMenuItem(const FbTk::FbString &label, Type &res): - FbTk::MenuItem(label), m_res(res) { - FbTk::MenuItem::setSelected(*m_res); - setToggleItem(true); - setCloseOnClick(false); - } - bool isSelected() const { return *m_res; } - // toggle state - void click(int button, int time, unsigned int mods) { - setSelected(!*m_res); - FbTk::MenuItem::click(button, time, mods); - } - void setSelected(bool value) { - m_res = value; - FbTk::MenuItem::setSelected(*m_res); - } -private: - Type &m_res; -}; - -#endif // BOOLMENUITEM_HH
A src/FbTk/Accessor.hh

@@ -0,0 +1,85 @@

+// Accessor.hh +// Copyright (c) 2007 Fluxbox Team (fluxgen at fluxbox dot org) +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +#ifndef FBTK_ACCESSOR_HH +#define FBTK_ACCESSOR_HH + +namespace FbTk { + +// base class for objects that act like data type T +template <typename T> +class Accessor { +public: + virtual Accessor<T> &operator =(const T &val) = 0; + virtual operator T() const = 0; +}; + +// essentially just a reference +template <typename T> +class SimpleAccessor: public Accessor<T> { +public: + SimpleAccessor(T &val): m_val(val) { } + inline Accessor<T> &operator =(const T &val) { m_val = val; return *this; } + inline operator T() const { return m_val; } + +private: + T &m_val; +}; + +// use object methods as an accessor +template <typename T, typename Receiver> +class ObjectAccessor: public Accessor<T> { +public: + typedef T (Receiver:: *Getter)() const; + typedef void (Receiver:: *Setter)(T &); + ObjectAccessor(Receiver &r, Getter g, Setter s): + m_receiver(r), m_getter(g), m_setter(s) { } + + inline operator T() const { return (m_receiver.*m_getter)(); } + inline Accessor<T> &operator =(const T &val) { + (m_receiver.*m_setter)(val); return *this; + } + +private: + Receiver &m_receiver; + Getter m_getter; + Setter m_setter; +}; + +// same as above but with no set method +template <typename T, typename Receiver> +class ConstObjectAccessor: public Accessor<T> { +public: + typedef T (Receiver:: *Getter)() const; + ConstObjectAccessor(const Receiver &r, Getter g): + m_receiver(r), m_getter(g) { } + + inline operator T() const { return (m_receiver.*m_getter)(); } + inline Accessor<T> &operator =(const T &val) { return *this; } + +private: + const Receiver &m_receiver; + Getter m_getter; +}; + +}; // end namespace FbTk + +#endif // FBTK_ACCESSOR_HH
A src/FbTk/BoolMenuItem.hh

@@ -0,0 +1,62 @@

+// BoolMenuItem.hh for FbTk +// Copyright (c) 2003 - 2007 Henrik Kinnunen (fluxgen at fluxbox dot org) +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +#ifndef FBTK_BOOLMENUITEM_HH +#define FBTK_BOOLMENUITEM_HH + +#include "MenuItem.hh" +#include "Accessor.hh" + +namespace FbTk { + +/// a bool menu item +class BoolMenuItem: public FbTk::MenuItem { +public: + BoolMenuItem(const FbTk::FbString &label, Accessor<bool> &item, + FbTk::RefCount<FbTk::Command> &cmd): + FbTk::MenuItem(label, cmd), m_item(item) { + FbTk::MenuItem::setSelected(m_item); + setToggleItem(true); + setCloseOnClick(false); + } + BoolMenuItem(const FbTk::FbString &label, Accessor<bool> &item): + FbTk::MenuItem(label), m_item(item) { + FbTk::MenuItem::setSelected(m_item); + setToggleItem(true); + setCloseOnClick(false); + } + bool isSelected() const { return m_item; } + // toggle state + void click(int button, int time, unsigned int mods) { + setSelected(!m_item); + FbTk::MenuItem::click(button, time, mods); + } + void setSelected(bool value) { + m_item = value; + FbTk::MenuItem::setSelected(m_item); + } +private: + Accessor<bool> &m_item; +}; + +}; // end namespace FbTk + +#endif // FBTK_BOOLMENUITEM_HH
M src/FbTk/DefaultValue.hhsrc/FbTk/DefaultValue.hh

@@ -22,58 +22,32 @@

#ifndef FBTK_DEFAULTVALUE_HH #define FBTK_DEFAULTVALUE_HH -namespace FbTk { +#include "Accessor.hh" -// classes for overriding default values without having to listen for changes -template <typename T> -class DefaultValue { -public: - DefaultValue(const T &def): - m_default(def), m_actual(def), m_use_default(true) { } +namespace FbTk { - inline const T &get() const { return m_use_default ? m_default : m_actual; } - inline void set(const T &val) { m_use_default = false; m_actual = val; } - inline void restoreDefault() { m_use_default = true; } - inline bool isDefault() const { return m_use_default; } +// class for overriding default values and restoring them later - inline DefaultValue<T> &operator =(const T &val) { - set(val); return *this; - } - - inline operator T() const { return get(); } - -private: - const T &m_default; - T m_actual; - bool m_use_default; -}; - -// designed for use with built-in types T, thus no need to return references -template <typename T, typename Receiver> -class DefaultAccessor { +// Ret = type of value that gets returned +// Def = type of default value -- may be Accessor<Ret> &, for example +template <typename Ret, typename Def=Ret &> +class DefaultValue: public Accessor<Ret> { public: - typedef T (Receiver:: *Accessor)() const; - DefaultAccessor(const Receiver &r, Accessor a): - m_receiver(r), m_accessor(a), m_actual((r.*a)()), - m_use_default(true) { } + DefaultValue(const Def def): + m_default(def), m_actual(def), m_use_default(true) { } - inline const T get() const { - return m_use_default ? (m_receiver.*m_accessor)() : m_actual; - } - inline void set(const T &val) { m_use_default = false; m_actual = val; } inline void restoreDefault() { m_use_default = true; } inline bool isDefault() const { return m_use_default; } - inline DefaultAccessor<T, Receiver> &operator =(const T &val) { - set(val); return *this; + inline DefaultValue<Ret, Def> &operator =(const Ret &val) { + m_use_default = false; m_actual = val; return *this; } - inline operator T() const { return get(); } + inline operator Ret() const { return m_use_default ? m_default : m_actual; } private: - const Receiver &m_receiver; - Accessor m_accessor; - T m_actual; + const Def m_default; + Ret m_actual; bool m_use_default; };
M src/FbTk/Makefile.amsrc/FbTk/Makefile.am

@@ -16,7 +16,7 @@ imlib2_SOURCE= ImageImlib2.hh ImageImlib2.cc

endif libFbTk_a_SOURCES = App.hh App.cc Color.cc Color.hh Command.hh \ - ObjectRegistry.hh DefaultValue.hh \ + ObjectRegistry.hh Accessor.hh DefaultValue.hh \ FileUtil.hh FileUtil.cc \ EventHandler.hh EventManager.hh EventManager.cc \ FbWindow.hh FbWindow.cc Font.cc Font.hh FontImp.hh \

@@ -25,6 +25,7 @@ ImageControl.hh ImageControl.cc \

LogicCommands.hh LogicCommands.cc \ MacroCommand.hh MacroCommand.cc \ Menu.hh Menu.cc MenuItem.hh MenuItem.cc \ + BoolMenuItem.hh IntMenuItem.hh \ MultiButtonMenuItem.hh MultiButtonMenuItem.cc \ MenuTheme.hh MenuTheme.cc NotCopyable.hh \ RefCount.hh SimpleCommand.hh SignalHandler.cc SignalHandler.hh \
M src/FbTk/Resource.hhsrc/FbTk/Resource.hh

@@ -25,6 +25,7 @@ #ifndef FBTK_RESOURCE_HH

#define FBTK_RESOURCE_HH #include "NotCopyable.hh" +#include "Accessor.hh" #include <string> #include <list>

@@ -160,23 +161,22 @@

/// Real resource class /** - * usage: Resource<int> someresource(resourcemanager, 10, "someresourcename", "somealternativename"); \n - * and then implement setFromString and getString \n - * example: \n - * template <> \n - * void Resource<int>::setFromString(const char *str) { \n - * *(*this) = atoi(str); \n + * usage: Resource<int> someresource(resourcemanager, 10, "someresourcename", "somealternativename"); + * and then implement setFromString and getString + * example: + * template <> + * void Resource<int>::setFromString(const char *str) { + * *(*this) = atoi(str); * } */ template <typename T> -class Resource:public Resource_base -{ +class Resource:public Resource_base, public Accessor<T> { public: typedef T Type; Resource(ResourceManager &rm, T val, const std::string &name, const std::string &altname): Resource_base(name, altname), - m_value(val), m_defaultval(val), + m_value(val), m_defaultval(val), m_rm(rm) { m_rm.addResource(*this); // add this to resource handler }

@@ -192,6 +192,7 @@ /// specialized, must be implemented

/// @return string value of resource std::string getString() const; + inline operator T() const { return m_value; } inline T& get() { return m_value; } inline T& operator*() { return m_value; } inline const T& operator*() const { return m_value; }
M src/FbWinFrame.ccsrc/FbWinFrame.cc

@@ -95,8 +95,8 @@ m_need_render(true),

m_button_size(1), m_height_before_shade(1), m_shaded(false), - m_focused_alpha(theme, &FbWinFrameTheme::focusedAlpha), - m_unfocused_alpha(theme, &FbWinFrameTheme::unfocusedAlpha), + m_focused_alpha(AlphaAcc(theme, &FbWinFrameTheme::focusedAlpha)), + m_unfocused_alpha(AlphaAcc(theme, &FbWinFrameTheme::unfocusedAlpha)), m_themelistener(*this), m_shape(m_window, theme.shapePlace()), m_disable_themeshape(false) {
M src/FbWinFrame.hhsrc/FbWinFrame.hh

@@ -400,8 +400,9 @@ int m_button_size; ///< size for all titlebar buttons

unsigned int m_height_before_shade; ///< height before shade, so we can restore it when we unshade bool m_shaded; ///< wheter we're shaded or not /// alpha values - FbTk::DefaultAccessor<unsigned char, FbWinFrameTheme> m_focused_alpha; - FbTk::DefaultAccessor<unsigned char, FbWinFrameTheme> m_unfocused_alpha; + typedef FbTk::ConstObjectAccessor<unsigned char, FbWinFrameTheme> AlphaAcc; + FbTk::DefaultValue<unsigned char, AlphaAcc> m_focused_alpha; + FbTk::DefaultValue<unsigned char, AlphaAcc> m_unfocused_alpha; class ThemeListener: public FbTk::Observer { public:
M src/IconbarTool.ccsrc/IconbarTool.cc

@@ -32,7 +32,6 @@ #include "Window.hh"

#include "IconButton.hh" #include "Workspace.hh" #include "FbMenu.hh" -#include "BoolMenuItem.hh" #include "FbTk/ObjectRegistry.hh" #include "WinClient.hh" #include "FocusControl.hh"

@@ -43,6 +42,7 @@

#include "FbTk/I18n.hh" #include "FbTk/Menu.hh" #include "FbTk/MenuItem.hh" +#include "FbTk/BoolMenuItem.hh" #include "FbTk/RefCount.hh" #include "FbTk/SimpleCommand.hh" #include "FbTk/ImageControl.hh"

@@ -288,9 +288,9 @@ RefCount<Command> save(FbTk::ObjectRegistry<Command>::instance().parse("saverc"));

save_and_reconfig->add(reconfig); save_and_reconfig->add(save); RefCount<Command> s_and_reconfig(save_and_reconfig); - m_menu.insert(new BoolMenuItem(_FB_XTEXT(Toolbar, ShowIcons, + m_menu.insert(new FbTk::BoolMenuItem(_FB_XTEXT(Toolbar, ShowIcons, "Show Pictures", "chooses if little icons are shown next to title in the iconbar"), - *m_rc_use_pixmap, s_and_reconfig)); + m_rc_use_pixmap, s_and_reconfig)); m_menu.updateMenu(); // must be internal menu, otherwise toolbar main menu tries to delete it. m_menu.setInternalMenu();
M src/IntResMenuItem.hhsrc/FbTk/IntMenuItem.hh

@@ -1,5 +1,5 @@

-// IntResMenuItem.hh for Fluxbox Window Manager -// Copyright (c) 2003 Henrik Kinnunen (fluxgen at fluxbox dot org) +// IntMenuItem.hh for FbTk +// Copyright (c) 2003-2007 Henrik Kinnunen (fluxgen at fluxbox dot org) // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the "Software"),

@@ -19,21 +19,21 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id$ - -#ifndef INTRESMENUITEM_HH -#define INTRESMENUITEM_HH +#ifndef FBTK_INTMENUITEM_HH +#define FBTK_INTMENUITEM_HH #include "MenuItem.hh" -#include "Resource.hh" +#include "Accessor.hh" #include <string> + +namespace FbTk { /// Changes an resource integer value between min and max -template <typename Type> -class IntResMenuItem: public FbTk::MenuItem { +class IntMenuItem: public FbTk::MenuItem { public: - IntResMenuItem(const FbTk::FbString &label, Type &res, int min_val, int max_val, FbTk::Menu &host_menu) : + IntMenuItem(const FbTk::FbString &label, Accessor<int> &res, + int min_val, int max_val, FbTk::Menu &host_menu) : FbTk::MenuItem(label, host_menu), m_org_label(FbTk::MenuItem::label()), m_max(max_val), m_min(min_val), m_res(res) { updateLabel();

@@ -61,16 +61,16 @@ last_time = time;

// make sure values stay within bounds _before_ we try to set m_res // otherwise, this may cause bugs (say, with casting to unsigned char) - if ((button == 4 || button == 3) && *m_res < m_max) { // up - if (*m_res + inc_val < m_max) - m_res.get() += inc_val; + if ((button == 4 || button == 3) && m_res < m_max) { // up + if (m_res + inc_val < m_max) + m_res = m_res + inc_val; else - m_res.get() = m_max; - } else if ((button == 5 || button == 1) && *m_res > m_min) { // down - if (*m_res - inc_val >= m_min) - m_res.get() -= inc_val; + m_res = m_max; + } else if ((button == 5 || button == 1) && m_res > m_min) { // down + if (m_res - inc_val >= m_min) + m_res = m_res - inc_val; else - m_res.get() = m_min; + m_res = m_min; } // update label

@@ -87,14 +87,16 @@ }

} void updateLabel() { - setLabel(appendIntValue(m_org_label, *m_res)); + setLabel(appendIntValue(m_org_label, m_res)); } private: std::string m_org_label; ///< original label const int m_max; ///< maximum value the integer can have const int m_min; ///< minimum value the integer can have - Type &m_res; ///< resource item to be changed + Accessor<int> &m_res; ///< resource item to be changed }; -#endif // INTRESMENUITEM_HH +}; // end namespace FbTk + +#endif // FBTK_INTMENUITEM_HH
M src/Makefile.amsrc/Makefile.am

@@ -96,7 +96,6 @@ ToolFactory.hh ToolFactory.cc

endif fluxbox_SOURCES = AtomHandler.hh ArrowButton.hh ArrowButton.cc \ - BoolMenuItem.hh \ FbAtoms.hh FbAtoms.cc FbWinFrame.hh FbWinFrame.cc \ FbWinFrameTheme.hh FbWinFrameTheme.cc \ fluxbox.cc fluxbox.hh \

@@ -111,7 +110,7 @@ Window.cc Window.hh \

Workspace.cc Workspace.hh \ FbCommands.hh FbCommands.cc LayerMenu.hh LayerMenu.cc \ Layer.hh \ - IntResMenuItem.hh FbMenu.hh FbMenu.cc \ + FbMenu.hh FbMenu.cc \ WinClient.hh WinClient.cc \ Strut.hh \ Xinerama.hh \
M src/MenuCreator.ccsrc/MenuCreator.cc

@@ -37,7 +37,6 @@ #include "LayerMenu.hh"

#include "SendToMenu.hh" #include "AlphaMenu.hh" #include "Layer.hh" -#include "BoolMenuItem.hh" #include "FbMenuParser.hh" #include "StyleMenuItem.hh"

@@ -45,6 +44,7 @@ #include "RootCmdMenuItem.hh"

#include "FbTk/I18n.hh" #include "FbTk/MultiButtonMenuItem.hh" +#include "FbTk/BoolMenuItem.hh" #include "FbTk/RefCount.hh" #include "FbTk/MacroCommand.hh" #include "FbTk/SimpleCommand.hh"

@@ -157,7 +157,7 @@ Parser::Item m_key, m_label, m_cmd, m_icon;

FbTk::Menu *m_menu; }; -class MenuContext: public LayerObject, public AlphaObject { +class MenuContext: public LayerObject { public: void moveToLayer(int layer_number) { if (WindowCmd<void>::window() == 0)

@@ -168,42 +168,6 @@ int layerNumber() const {

if (WindowCmd<void>::window() == 0) return -1; return WindowCmd<void>::window()->layerItem().getLayerNum(); - } - - int getFocusedAlpha() const { - if (WindowCmd<void>::window() == 0) - return 255; - return WindowCmd<void>::window()->getFocusedAlpha(); - } - - int getUnfocusedAlpha() const { - if (WindowCmd<void>::window() == 0) - return 255; - return WindowCmd<void>::window()->getUnfocusedAlpha(); - } - - bool getUseDefaultAlpha() const { - if (WindowCmd<void>::window() == 0) - return true; - return WindowCmd<void>::window()->getUseDefaultAlpha(); - } - - void setFocusedAlpha(int alpha) { - if (WindowCmd<void>::window() == 0) - return; - WindowCmd<void>::window()->setFocusedAlpha(alpha); - } - - void setUnfocusedAlpha(int alpha) { - if (WindowCmd<void>::window() == 0) - return; - WindowCmd<void>::window()->setUnfocusedAlpha(alpha); - } - - void setDefaultAlpha() { - if (WindowCmd<void>::window() == 0) - return; - WindowCmd<void>::window()->setDefaultAlpha(); } };

@@ -551,8 +515,8 @@

static MenuContext context; if (type == "shade") { - static ObjectResource<FluxboxWindow, bool> res(&WindowCmd<void>::window, &FluxboxWindow::isShaded, &FluxboxWindow::shade, false); - menu.insert(new BoolResMenuItem<ObjectResource<FluxboxWindow, bool> >( + static WindowAccessor<bool> res(&FluxboxWindow::isShaded, &FluxboxWindow::setShaded, false); + menu.insert(new FbTk::BoolMenuItem( label.empty()?_FB_XTEXT(Windowmenu, Shade, "Shade", "Shade the window"):label, res));

@@ -575,8 +539,8 @@ maximize_item->setCommand(2, maximize_vert_cmd);

maximize_item->setCommand(3, maximize_horiz_cmd); menu.insert(maximize_item); } else if (type == "iconify") { - static ObjectResource<FluxboxWindow, bool> res(&WindowCmd<void>::window, &FluxboxWindow::isIconic, &FluxboxWindow::toggleIconic, false); - menu.insert(new BoolResMenuItem<ObjectResource<FluxboxWindow, bool> >( + static WindowAccessor<bool> res(&FluxboxWindow::isIconic, &FluxboxWindow::setIconic, false); + menu.insert(new FbTk::BoolMenuItem( label.empty() ? _FB_XTEXT(Windowmenu, Iconify, "Iconify", "Iconify the window") :

@@ -607,8 +571,8 @@ "Raise", "Raise the window"):

label, raise_cmd); } else if (type == "stick") { - static ObjectResource<FluxboxWindow, bool> res(&WindowCmd<void>::window, &FluxboxWindow::isStuck, &FluxboxWindow::stick, false); - menu.insert(new BoolResMenuItem<ObjectResource<FluxboxWindow, bool> >( + static WindowAccessor<bool> res(&FluxboxWindow::isStuck, &FluxboxWindow::setStuck, false); + menu.insert(new FbTk::BoolMenuItem( label.empty() ? _FB_XTEXT(Windowmenu, Stick, "Stick", "Stick the window"):

@@ -625,8 +589,7 @@ menu.insert(label.empty() ? _FB_XTEXT(Configmenu, Transparency, "Transparency",

"Menu containing various transparency options"): label, new AlphaMenu(screen->menuTheme(), screen->imageControl(), - *screen->layerManager().getLayer(Layer::MENU), - context)); + *screen->layerManager().getLayer(Layer::MENU))); } #endif // HAVE_XRENDER } else if (type == "extramenus") {
D src/ObjectResource.hh

@@ -1,145 +0,0 @@

-// ObjectResource.hh for Fluxbox -// Copyright (c) 2007 Henrik Kinnunen (fluxgen at fluxbox dot org) -// and Simon Bowden (rathnor at users.sourceforge.net) -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the "Software"), -// to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, -// and/or sell copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -// DEALINGS IN THE SOFTWARE. - -// $Id$ - -#ifndef OBJECTRESOURCE_HH -#define OBJECTRESOURCE_HH - -/* This is a generic resource that can be used as an accessor to a value in an object. - The constructors allow to select between: - 1a. giving an object of ObjectType, OR - 1b. giving a function returning an object of ObjectType - - 2a. a function that sets a value - 2b. a function that toggles a value - */ - -template <typename ObjectType, typename ValueType> -class ObjectResource { -public: - typedef ValueType (ObjectType::* getResourceType)() const; - typedef void (ObjectType::* setResourceType)(ValueType); - typedef void (ObjectType::* toggleResourceType)(); - typedef ObjectType* (*getResourceObject)(); - - ObjectResource(ObjectType *object, getResourceType get, setResourceType set, ValueType a_default) : - m_get(get), m_set(set), m_istoggle(false), m_object(object), - m_default(a_default), m_use_accessor(false) { - } - - ObjectResource(ObjectType *object, getResourceType get, toggleResourceType toggle, ValueType a_default) : - m_get(get), m_toggle(toggle), m_istoggle(true), m_object(object), - m_default(a_default), m_use_accessor(false) { - } - - ObjectResource(getResourceObject object_accessor, getResourceType get, setResourceType set, ValueType a_default) : - m_get(get), m_set(set), m_istoggle(false), m_object_accessor(object_accessor), - m_default(a_default), m_use_accessor(true) { - } - - ObjectResource(getResourceObject object_accessor, getResourceType get, toggleResourceType toggle, ValueType a_default) : - m_get(get), m_toggle(toggle), m_istoggle(true), m_object_accessor(object_accessor), - m_default(a_default), m_use_accessor(true) { - } - - ObjectResource<ObjectType, ValueType>& operator = (const ValueType newvalue) { - ObjectType * obj = getObject(); - if (!obj) - return *this; - - if (m_istoggle) { - if (newvalue != (operator*)()) - (obj->*m_toggle)(); - } else { - (obj->*m_set)(newvalue); - } - return *this; - } - - ObjectResource<ObjectType, ValueType>& operator += (const ValueType newvalue) { - ObjectType * obj = getObject(); - if (obj && !m_istoggle) - (obj->*m_set)((operator*)()+newvalue); - return *this; - } - - ObjectResource<ObjectType, ValueType>& operator -= (const ValueType newvalue) { - ObjectType * obj = getObject(); - if (obj && !m_istoggle) - (obj->*m_set)((operator*)()-newvalue); - return *this; - } - - // this is a touch dirty, but it makes us compatible with FbTk::Resource<int> in IntResMenuItem - ObjectResource<ObjectType, ValueType>& get() { - return *this; - } - - ValueType operator*() { - ObjectType * obj = getObject(); - if (!obj) - return m_default; - - return (obj->*m_get)(); - } - - const ValueType operator*() const { - ObjectType * obj = getObject(); - if (!obj) - return m_default; - - return (obj->*m_get)(); - } - -private: - // choose one get and one set function - - ObjectType * getObject() { - if (m_use_accessor) - return (*m_object_accessor)(); - else - return m_object; - } - - getResourceType m_get; - - union { - setResourceType m_set; - toggleResourceType m_toggle; - }; - - bool m_istoggle; - - union { - ObjectType *m_object; - getResourceObject m_object_accessor; - }; - - // default is only used when object isn't set (saves crashes) - ValueType m_default; - - bool m_use_accessor; -}; - - -#endif // OBJECTRESOURCE_HH
M src/Screen.ccsrc/Screen.cc

@@ -47,8 +47,8 @@ #include "WinButtonTheme.hh"

#include "SlitTheme.hh" // menu items -#include "BoolMenuItem.hh" -#include "IntResMenuItem.hh" +#include "FbTk/BoolMenuItem.hh" +#include "FbTk/IntMenuItem.hh" #include "FocusModelMenuItem.hh" // menus

@@ -1576,7 +1576,7 @@ "Focus Model",

"Method used to give focus to windows"); FbTk::Menu *focus_menu = createMenu(focusmenu_label); -#define _BOOLITEM(m,a, b, c, d, e, f) (m).insert(new BoolMenuItem(_FB_XTEXT(a, b, c, d), e, f)) +#define _BOOLITEM(m,a, b, c, d, e, f) (m).insert(new FbTk::BoolMenuItem(_FB_XTEXT(a, b, c, d), e, f)) #define _FOCUSITEM(a, b, c, d, e) \

@@ -1599,19 +1599,19 @@ MouseTabFocus, "MouseTabFocus", "Hover over tab to focus windows"),

focusControl(), FocusControl::MOUSETABFOCUS, save_and_reconfigure)); try { - focus_menu->insert(new BoolMenuItem(_FB_XTEXT(Configmenu, FocusNew, + focus_menu->insert(new FbTk::BoolMenuItem(_FB_XTEXT(Configmenu, FocusNew, "Focus New Windows", "Focus newly created windows"), - *m_resource_manager.getResource<bool>(name() + ".focusNewWindows"), + m_resource_manager.getResource<bool>(name() + ".focusNewWindows"), saverc_cmd)); } catch (FbTk::ResourceException e) { cerr<<e.what()<<endl; } - focus_menu->insert(new BoolMenuItem(_FB_XTEXT(Configmenu, + focus_menu->insert(new FbTk::BoolMenuItem(_FB_XTEXT(Configmenu, AutoRaise, "Auto Raise", "Auto Raise windows on sloppy"), - *resource.auto_raise, + resource.auto_raise, save_and_reconfigure)); focus_menu->updateMenu();

@@ -1628,17 +1628,17 @@ FbTk::Menu *maxmenu = createMenu(maxmenu_label);

_BOOLITEM(*maxmenu, Configmenu, FullMax, "Full Maximization", "Maximise over slit, toolbar, etc", - *resource.full_max, saverc_cmd); + resource.full_max, saverc_cmd); _BOOLITEM(*maxmenu, Configmenu, MaxIgnoreInc, "Ignore Resize Increment", "Maximizing Ignores Resize Increment (e.g. xterm)", - *resource.max_ignore_inc, saverc_cmd); + resource.max_ignore_inc, saverc_cmd); _BOOLITEM(*maxmenu, Configmenu, MaxDisableMove, "Disable Moving", "Don't Allow Moving While Maximized", - *resource.max_disable_move, saverc_cmd); + resource.max_disable_move, saverc_cmd); _BOOLITEM(*maxmenu, Configmenu, MaxDisableResize, "Disable Resizing", "Don't Allow Resizing While Maximized", - *resource.max_disable_resize, saverc_cmd); + resource.max_disable_resize, saverc_cmd); maxmenu->updateMenu(); menu.insert(maxmenu_label, maxmenu);

@@ -1658,16 +1658,16 @@ tab_menu->insert(tabplacement_label, tabplacement_menu);

_BOOLITEM(*tab_menu,Configmenu, TabsInTitlebar, "Tabs in Titlebar", "Tabs in Titlebar", - *resource.default_internal_tabs, save_and_reconftabs); - tab_menu->insert(new BoolMenuItem(_FB_XTEXT(Common, MaximizeOver, + resource.default_internal_tabs, save_and_reconftabs); + tab_menu->insert(new FbTk::BoolMenuItem(_FB_XTEXT(Common, MaximizeOver, "Maximize Over", "Maximize over this thing when maximizing"), - *resource.max_over_tabs, save_and_reconfigure)); - tab_menu->insert(new BoolMenuItem(_FB_XTEXT(Toolbar, ShowIcons, + resource.max_over_tabs, save_and_reconfigure)); + tab_menu->insert(new FbTk::BoolMenuItem(_FB_XTEXT(Toolbar, ShowIcons, "Show Pictures", "chooses if little icons are shown next to title in the iconbar"), - *resource.tabs_use_pixmap, save_and_reconfigure)); + resource.tabs_use_pixmap, save_and_reconfigure)); FbTk::MenuItem *tab_width_item = - new IntResMenuItem< FbTk::Resource<int> >(_FB_XTEXT(Configmenu, ExternalTabWidth, + new FbTk::IntMenuItem(_FB_XTEXT(Configmenu, ExternalTabWidth, "External Tab Width", "Width of external-style tabs"), resource.tab_width, 10, 3000, /* silly number */

@@ -1715,10 +1715,11 @@ "Menu containing various transparency options");

FbTk::Menu *alpha_menu = createMenu(alphamenu_label); if (FbTk::Transparent::haveComposite(true)) { - alpha_menu->insert(new BoolMenuItem(_FB_XTEXT(Configmenu, ForcePseudoTrans, + static FbTk::SimpleAccessor<bool> s_pseudo(Fluxbox::instance()->getPseudoTrans()); + alpha_menu->insert(new FbTk::BoolMenuItem(_FB_XTEXT(Configmenu, ForcePseudoTrans, "Force Pseudo-Transparency", "When composite is available, still use old pseudo-transparency"), - Fluxbox::instance()->getPseudoTrans(), save_and_reconfigure)); + s_pseudo, save_and_reconfigure)); } // in order to save system resources, don't save or reconfigure alpha

@@ -1727,7 +1728,7 @@ FbTk::RefCount<FbTk::Command> delayed_save_and_reconf(

new ::DelayedCmd(save_and_reconfigure)); FbTk::MenuItem *focused_alpha_item = - new IntResMenuItem< FbTk::Resource<int> >(_FB_XTEXT(Configmenu, FocusedAlpha, + new FbTk::IntMenuItem(_FB_XTEXT(Configmenu, FocusedAlpha, "Focused Window Alpha", "Transparency level of the focused window"), resource.focused_alpha, 0, 255, *alpha_menu);

@@ -1735,7 +1736,7 @@ focused_alpha_item->setCommand(delayed_save_and_reconf);

alpha_menu->insert(focused_alpha_item); FbTk::MenuItem *unfocused_alpha_item = - new IntResMenuItem< FbTk::Resource<int> >(_FB_XTEXT(Configmenu, + new FbTk::IntMenuItem(_FB_XTEXT(Configmenu, UnfocusedAlpha, "Unfocused Window Alpha", "Transparency level of unfocused windows"),

@@ -1745,7 +1746,7 @@ unfocused_alpha_item->setCommand(delayed_save_and_reconf);

alpha_menu->insert(unfocused_alpha_item); FbTk::MenuItem *menu_alpha_item = - new IntResMenuItem< FbTk::Resource<int> >(_FB_XTEXT(Configmenu, MenuAlpha, + new FbTk::IntMenuItem(_FB_XTEXT(Configmenu, MenuAlpha, "Menu Alpha", "Transparency level of menu"), resource.menu_alpha, 0, 255, *alpha_menu); menu_alpha_item->setCommand(delayed_save_and_reconf);

@@ -1763,21 +1764,21 @@ menu.insert(it->first, it->second);

_BOOLITEM(menu, Configmenu, ImageDithering, "Image Dithering", "Image Dithering", - *resource.image_dither, save_and_reconfigure); + resource.image_dither, save_and_reconfigure); _BOOLITEM(menu, Configmenu, OpaqueMove, "Opaque Window Moving", "Window Moving with whole window visible (as opposed to outline moving)", - *resource.opaque_move, saverc_cmd); + resource.opaque_move, saverc_cmd); _BOOLITEM(menu, Configmenu, WorkspaceWarping, "Workspace Warping", "Workspace Warping - dragging windows to the edge and onto the next workspace", - *resource.workspace_warping, saverc_cmd); + resource.workspace_warping, saverc_cmd); _BOOLITEM(menu, Configmenu, DecorateTransient, "Decorate Transient Windows", "Decorate Transient Windows", - *resource.decorate_transient, saverc_cmd); + resource.decorate_transient, saverc_cmd); _BOOLITEM(menu, Configmenu, ClickRaises, "Click Raises", "Click Raises", - *resource.click_raises, saverc_cmd); + resource.click_raises, saverc_cmd); #undef _BOOLITEM
M src/Slit.ccsrc/Slit.cc

@@ -38,7 +38,6 @@

#include "Screen.hh" #include "ImageControl.hh" #include "RefCount.hh" -#include "BoolMenuItem.hh" #include "EventManager.hh" #include "SimpleCommand.hh" #include "MacroCommand.hh"

@@ -50,7 +49,6 @@ #include "RootTheme.hh"

#include "FbTk/Theme.hh" #include "FbMenu.hh" #include "Transparent.hh" -#include "IntResMenuItem.hh" #ifdef XINERAMA #include "Xinerama.hh"

@@ -63,6 +61,8 @@ #include "FbTk/App.hh"

#include "FbTk/MenuSeparator.hh" #include "FbTk/StringUtil.hh" #include "FbTk/I18n.hh" +#include "FbTk/BoolMenuItem.hh" +#include "FbTk/IntMenuItem.hh" #ifdef HAVE_SYS_STAT_H #include <sys/types.h>

@@ -1268,17 +1268,17 @@ ));

} #endif //XINERAMA - m_slitmenu.insert(new BoolMenuItem(_FB_XTEXT(Common, AutoHide, "Auto hide", "This thing automatically hides when not close by"), - *m_rc_auto_hide, + m_slitmenu.insert(new FbTk::BoolMenuItem(_FB_XTEXT(Common, AutoHide, "Auto hide", "This thing automatically hides when not close by"), + m_rc_auto_hide, save_and_reconfigure_slit)); - m_slitmenu.insert(new BoolMenuItem(_FB_XTEXT(Common, MaximizeOver,"Maximize Over", "Maximize over this thing when maximizing"), - *m_rc_maximize_over, + m_slitmenu.insert(new FbTk::BoolMenuItem(_FB_XTEXT(Common, MaximizeOver,"Maximize Over", "Maximize over this thing when maximizing"), + m_rc_maximize_over, save_and_reconfigure_slit)); // this saves resources and clears the slit window to update alpha value FbTk::MenuItem *alpha_menuitem = - new IntResMenuItem< FbTk::Resource<int> >(_FB_XTEXT(Common, Alpha, "Alpha", "Transparency level"), + new FbTk::IntMenuItem(_FB_XTEXT(Common, Alpha, "Alpha", "Transparency level"), m_rc_alpha, 0, 255, m_slitmenu); // setup command for alpha value
M src/Toolbar.ccsrc/Toolbar.cc

@@ -36,8 +36,6 @@ #include "fluxbox.hh"

#include "Keys.hh" #include "Screen.hh" #include "WindowCmd.hh" -#include "IntResMenuItem.hh" -#include "BoolMenuItem.hh" #ifdef XINERAMA #include "Xinerama.hh"

@@ -54,6 +52,8 @@ #include "FbTk/EventManager.hh"

#include "FbTk/SimpleCommand.hh" #include "FbTk/StringUtil.hh" #include "FbTk/Transparent.hh" +#include "FbTk/BoolMenuItem.hh" +#include "FbTk/IntMenuItem.hh" // use GNU extensions

@@ -835,17 +835,17 @@ visible_macro->add(toggle_visible);

visible_macro->add(reconfig_toolbar); visible_macro->add(save_resources); RefCommand toggle_visible_cmd(visible_macro); - menu().insert(new BoolMenuItem(_FB_XTEXT(Common, Visible, + menu().insert(new FbTk::BoolMenuItem(_FB_XTEXT(Common, Visible, "Visible", "Whether this item is visible"), - *m_rc_visible, toggle_visible_cmd)); + m_rc_visible, toggle_visible_cmd)); - menu().insert(new BoolMenuItem(_FB_XTEXT(Common, AutoHide, + menu().insert(new FbTk::BoolMenuItem(_FB_XTEXT(Common, AutoHide, "Auto hide", "Toggle auto hide of toolbar"), - *m_rc_auto_hide, + m_rc_auto_hide, reconfig_toolbar_and_save_resource)); MenuItem *toolbar_menuitem = - new IntResMenuItem< FbTk::Resource<int> >(_FB_XTEXT(Toolbar, WidthPercent, + new FbTk::IntMenuItem(_FB_XTEXT(Toolbar, WidthPercent, "Toolbar width percent", "Percentage of screen width taken by toolbar"), m_rc_width_percent,

@@ -855,10 +855,10 @@

toolbar_menuitem->setCommand(reconfig_toolbar_and_save_resource); menu().insert(toolbar_menuitem); - menu().insert(new BoolMenuItem(_FB_XTEXT(Common, MaximizeOver, + menu().insert(new FbTk::BoolMenuItem(_FB_XTEXT(Common, MaximizeOver, "Maximize Over", "Maximize over this thing when maximizing"), - *m_rc_maximize_over, + m_rc_maximize_over, reconfig_toolbar_and_save_resource)); menu().insert(_FB_XTEXT(Menu, Layer, "Layer...", "Title of Layer menu"), &layerMenu()); #ifdef XINERAMA

@@ -922,7 +922,7 @@

// this saves resources and clears the slit window to update alpha value FbTk::MenuItem *alpha_menuitem = - new IntResMenuItem< FbTk::Resource<int> >(_FB_XTEXT(Common, Alpha, "Alpha", "Transparency level"), + new FbTk::IntMenuItem(_FB_XTEXT(Common, Alpha, "Alpha", "Transparency level"), m_rc_alpha, 0, 255, menu()); // setup command for alpha value
M src/Window.ccsrc/Window.cc

@@ -264,8 +264,8 @@ m_client(&client),

m_toggled_decos(false), m_icon_hidden(false), m_focus_hidden(false), - m_focus_new(screen().focusControl(), &FocusControl::focusNew), - m_mouse_focus(screen().focusControl(), &FocusControl::isMouseFocus), + m_focus_new(BoolAcc(screen().focusControl(), &FocusControl::focusNew)), + m_mouse_focus(BoolAcc(screen().focusControl(), &FocusControl::isMouseFocus)), m_click_focus(true), m_old_pos_x(0), m_old_pos_y(0), m_old_width(1), m_old_height(1),

@@ -1745,17 +1745,18 @@ // TODO: this should set IconicState, but then we can't focus the window

} void FluxboxWindow::shadeOn() { - if (!shaded) shade(); - } void FluxboxWindow::shadeOff() { - if (shaded) shade(); +} +void FluxboxWindow::setShaded(bool val) { + if (val != shaded) + shade(); } void FluxboxWindow::stick() {

@@ -1783,6 +1784,17 @@ }

} +void FluxboxWindow::setStuck(bool val) { + if (val != stuck) + stick(); +} + +void FluxboxWindow::setIconic(bool val) { + if (val && isIconic()) + deiconify(); + if (!val && !isIconic()) + iconify(); +} void FluxboxWindow::raise() { if (isIconic())
M src/Window.hhsrc/Window.hh

@@ -270,10 +270,16 @@ /// shades window

void shadeOn(); /// unshades window void shadeOff(); + /// sets shaded state + void setShaded(bool val); /// toggles sticky void stick(); + /// sets stuck state + void setStuck(bool val); /// toggles iconic void toggleIconic(); + /// sets iconic state + void setIconic(bool val); void raise(); void lower(); void tempRaise();

@@ -611,10 +617,11 @@ } functions;

bool m_icon_hidden; ///< if the window is in the iconbar bool m_focus_hidden; ///< if the window is in the NextWindow list + typedef FbTk::ConstObjectAccessor<bool, FocusControl> BoolAcc; /// if the window is normally focused when mapped - FbTk::DefaultAccessor<bool, FocusControl> m_focus_new; + FbTk::DefaultValue<bool, BoolAcc> m_focus_new; /// if the window is focused with EnterNotify - FbTk::DefaultAccessor<bool, FocusControl> m_mouse_focus; + FbTk::DefaultValue<bool, BoolAcc> m_mouse_focus; bool m_click_focus; ///< if the window is focused by clicking int m_old_pos_x, m_old_pos_y; ///< old position so we can restore from maximized unsigned int m_old_width, m_old_height; ///< old size so we can restore from maximized state
M src/WindowCmd.hhsrc/WindowCmd.hh

@@ -25,6 +25,7 @@ #ifndef WINDOWCMD_HH

#define WINDOWCMD_HH #include "FbTk/Command.hh" +#include "FbTk/Accessor.hh" #include "Window.hh" #include "WinClient.hh"

@@ -64,5 +65,49 @@ private:

Action m_action; }; +/// accesses values in current window +template <typename Ret, typename Def=Ret> +class WindowAccessor: public FbTk::Accessor<Ret> { +public: + typedef Ret (FluxboxWindow:: *Getter)() const; + typedef void (FluxboxWindow:: *Setter)(Ret); + WindowAccessor(Getter g, Setter s, Def def): + m_getter(g), m_setter(s), m_def(def) { } + + inline operator Ret() const { + FluxboxWindow *fbwin = WindowCmd<void>::window(); + return fbwin ? (fbwin->*m_getter)() : m_def; + } + inline FbTk::Accessor<Ret> &operator =(const Ret &val) { + FluxboxWindow *fbwin = WindowCmd<void>::window(); + if (fbwin) + (fbwin->*m_setter)(val); + return *this; + } + +private: + Getter m_getter; + Setter m_setter; + Def m_def; +}; + +/// same as above but only reads +template <typename Ret, typename Def=Ret> +class ConstWindowAccessor: public FbTk::Accessor<Ret> { +public: + typedef Ret (FluxboxWindow:: *Getter)() const; + ConstWindowAccessor(Getter g, Def def): + m_getter(g), m_def(def) { } + + inline operator Ret() const { + FluxboxWindow *fbwin = WindowCmd<void>::window(); + return fbwin ? (fbwin->*m_getter)() : m_def; + } + inline FbTk::Accessor<Ret> &operator =(const Ret &val) { return *this; } + +private: + Getter m_getter; + Def m_def; +}; #endif // WINDOWCMD_HH