From f5024351e79e92d551d561e9756f0869e51af505 Mon Sep 17 00:00:00 2001 From: Mark Tiefenbruck Date: Wed, 26 Dec 2007 13:50:44 -0800 Subject: stupid & --- src/FbTk/DefaultValue.hh | 82 ++++++++++++++++++++++++++++++++++++++++++++++++ src/FbTk/Makefile.am | 2 +- src/Window.cc | 4 +-- src/Window.hh | 8 +++-- 4 files changed, 91 insertions(+), 5 deletions(-) create mode 100644 src/FbTk/DefaultValue.hh diff --git a/src/FbTk/DefaultValue.hh b/src/FbTk/DefaultValue.hh new file mode 100644 index 0000000..9f52212 --- /dev/null +++ b/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 +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 &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 +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 &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 diff --git a/src/FbTk/Makefile.am b/src/FbTk/Makefile.am index 081bd07..0de5475 100644 --- a/src/FbTk/Makefile.am +++ b/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 \ diff --git a/src/Window.cc b/src/Window.cc index 5eb380e..8126e9e 100644 --- a/src/Window.cc +++ b/src/Window.cc @@ -264,8 +264,8 @@ FluxboxWindow::FluxboxWindow(WinClient &client, FbWinFrameTheme &tm, 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), diff --git a/src/Window.hh b/src/Window.hh index d0db606..5dbe055 100644 --- a/src/Window.hh +++ b/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 @@ private: 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 m_focus_new; + /// if the window is focused with EnterNotify + FbTk::DefaultAccessor 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 -- cgit v0.11.2