stupid &
Mark Tiefenbruck mark@fluxbox.org
4 files changed,
91 insertions(+),
5 deletions(-)
A
src/FbTk/DefaultValue.hh
@@ -0,0 +1,82 @@
+// DefaultValue.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_DEFAULTVALUE_HH +#define FBTK_DEFAULTVALUE_HH + +namespace FbTk { + +// 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) { } + + 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 void isDefault() const { return m_use_default; } + + 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 { +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) { } + + 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 void isDefault() const { return m_use_default; } + + inline DefaultAccessor<T, Receiver> &operator =(const T &val) { + set(val); return *this; + } + + inline operator T() const { return get(); } + +private: + const Receiver &m_receiver; + Accessor m_accessor; + T m_actual; + bool m_use_default; +}; + +}; // end namespace FbTk + +#endif // FBTK_DEFAULTVALUE_HH
M
src/FbTk/Makefile.am
→
src/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 \ + ObjectRegistry.hh DefaultValue.hh \ FileUtil.hh FileUtil.cc \ EventHandler.hh EventManager.hh EventManager.cc \ FbWindow.hh FbWindow.cc Font.cc Font.hh FontImp.hh \
M
src/Window.cc
→
src/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().focusNew()), - m_mouse_focus(screen().focusControl().isMouseFocus()), + m_focus_new(screen().focusControl(), &FocusControl::focusNew), + m_mouse_focus(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),
M
src/Window.hh
→
src/Window.hh
@@ -27,6 +27,7 @@
#ifndef WINDOW_HH #define WINDOW_HH +#include "FbTk/DefaultValue.hh" #include "FbTk/Timer.hh" #include "FbTk/Subject.hh" #include "FbTk/Observer.hh"@@ -49,6 +50,7 @@ class WinClient;
class FbWinFrameTheme; class BScreen; class FbWinFrame; +class FocusControl; namespace FbTk { class TextButton;@@ -609,8 +611,10 @@ } functions;
bool m_icon_hidden; ///< if the window is in the iconbar bool m_focus_hidden; ///< if the window is in the NextWindow list - bool m_focus_new; ///< if the window is normally focused when mapped - bool m_mouse_focus; ///< if the window is focused with EnterNotify + /// if the window is normally focused when mapped + FbTk::DefaultAccessor<bool, FocusControl> m_focus_new; + /// if the window is focused with EnterNotify + FbTk::DefaultAccessor<bool, FocusControl> 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