From 0305cbdc3ae8525c74b2bb9b23884035549e3407 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sun, 26 May 2002 20:25:38 +0000 Subject: [PATCH] add Configuration class for generic configuration data load/save-ing. use Configuration class throughout code. no longer save rc file on exit, save when any options are changed. --- src/Configmenu.cc | 62 +++-- src/Configmenu.hh | 7 +- src/Configuration.cc | 238 +++++++++++++++++ src/Configuration.hh | 97 +++++++ src/ImageControl.cc | 6 +- src/Makefile.am | 169 ++++++------ src/Rootmenu.cc | 2 +- src/Screen.cc | 569 +++++++++++++++++++++++++++-------------- src/Screen.hh | 94 +++---- src/Slit.cc | 189 +++++++++++--- src/Slit.hh | 25 +- src/Timer.cc | 4 +- src/Toolbar.cc | 150 +++++++++-- src/Toolbar.hh | 20 +- src/Util.cc | 21 ++ src/Util.hh | 9 + src/Window.cc | 12 +- src/blackbox.cc | 594 ++++--------------------------------------- src/blackbox.hh | 6 +- 19 files changed, 1294 insertions(+), 980 deletions(-) create mode 100644 src/Configuration.cc create mode 100644 src/Configuration.hh diff --git a/src/Configmenu.cc b/src/Configmenu.cc index 3a314af5..89f93f9b 100644 --- a/src/Configmenu.cc +++ b/src/Configmenu.cc @@ -54,14 +54,19 @@ Configmenu::Configmenu(BScreen *scr) : Basemenu(scr) { insert(i18n(ConfigmenuSet, ConfigmenuFocusLast, "Focus Last Window on Workspace"), 5); update(); + setValues(); +} + - setItemSelected(2, getScreen()->getImageControl()->doDither()); +void Configmenu::setValues(void) { + setItemSelected(2, getScreen()->doImageDither()); setItemSelected(3, getScreen()->doOpaqueMove()); setItemSelected(4, getScreen()->doFullMax()); setItemSelected(5, getScreen()->doFocusNew()); setItemSelected(6, getScreen()->doFocusLast()); } + Configmenu::~Configmenu(void) { delete focusmenu; delete placementmenu; @@ -73,37 +78,29 @@ void Configmenu::itemSelected(int button, unsigned int index) { BasemenuItem *item = find(index); - if (!item->function()) + if (! item->function()) return; switch(item->function()) { case 1: { // dither - getScreen()->getImageControl()-> - setDither((! getScreen()->getImageControl()->doDither())); - - setItemSelected(index, getScreen()->getImageControl()->doDither()); - + getScreen()->saveImageDither(! getScreen()->doImageDither()); + setItemSelected(index, getScreen()->doImageDither()); break; } case 2: { // opaque move getScreen()->saveOpaqueMove((! getScreen()->doOpaqueMove())); - setItemSelected(index, getScreen()->doOpaqueMove()); - break; } case 3: { // full maximization getScreen()->saveFullMax((! getScreen()->doFullMax())); - setItemSelected(index, getScreen()->doFullMax()); - break; } case 4: { // focus new windows getScreen()->saveFocusNew((! getScreen()->doFocusNew())); - setItemSelected(index, getScreen()->doFocusNew()); break; } @@ -118,6 +115,7 @@ void Configmenu::itemSelected(int button, unsigned int index) { void Configmenu::reconfigure(void) { + setValues(); focusmenu->reconfigure(); placementmenu->reconfigure(); @@ -134,8 +132,12 @@ Configmenu::Focusmenu::Focusmenu(Configmenu *cm) : Basemenu(cm->getScreen()) { insert(i18n(ConfigmenuSet, ConfigmenuAutoRaise, "Auto Raise"), 3); insert(i18n(ConfigmenuSet, ConfigmenuClickRaise, "Click Raise"), 4); update(); + setValues(); +} - setItemSelected(0, (! getScreen()->isSloppyFocus())); + +void Configmenu::Focusmenu::setValues(void) { + setItemSelected(0, ! getScreen()->isSloppyFocus()); setItemSelected(1, getScreen()->isSloppyFocus()); setItemEnabled(2, getScreen()->isSloppyFocus()); setItemSelected(2, getScreen()->doAutoRaise()); @@ -144,13 +146,19 @@ Configmenu::Focusmenu::Focusmenu(Configmenu *cm) : Basemenu(cm->getScreen()) { } +void Configmenu::Focusmenu::reconfigure(void) { + setValues(); + Basemenu::reconfigure(); +} + + void Configmenu::Focusmenu::itemSelected(int button, unsigned int index) { if (button != 1) return; BasemenuItem *item = find(index); - if (!item->function()) + if (! item->function()) return; switch (item->function()) { @@ -171,13 +179,7 @@ void Configmenu::Focusmenu::itemSelected(int button, unsigned int index) { getScreen()->updateFocusModel(); break; } - - setItemSelected(0, (! getScreen()->isSloppyFocus())); - setItemSelected(1, getScreen()->isSloppyFocus()); - setItemEnabled(2, getScreen()->isSloppyFocus()); - setItemSelected(2, getScreen()->doAutoRaise()); - setItemEnabled(3, getScreen()->isSloppyFocus()); - setItemSelected(3, getScreen()->doClickRaise()); + setValues(); } @@ -201,7 +203,11 @@ Configmenu::Placementmenu::Placementmenu(Configmenu *cm): insert(i18n(ConfigmenuSet, ConfigmenuBottomTop, "Bottom to Top"), BScreen::BottomTop); update(); + setValues(); +} + +void Configmenu::Placementmenu::setValues(void) { switch (getScreen()->getPlacementPolicy()) { case BScreen::RowSmartPlacement: setItemSelected(0, True); @@ -216,10 +222,8 @@ Configmenu::Placementmenu::Placementmenu(Configmenu *cm): break; } - bool rl = (getScreen()->getRowPlacementDirection() == - BScreen::LeftRight), - tb = (getScreen()->getColPlacementDirection() == - BScreen::TopBottom); + bool rl = (getScreen()->getRowPlacementDirection() == BScreen::LeftRight), + tb = (getScreen()->getColPlacementDirection() == BScreen::TopBottom); setItemSelected(3, rl); setItemSelected(4, ! rl); @@ -229,13 +233,19 @@ Configmenu::Placementmenu::Placementmenu(Configmenu *cm): } +void Configmenu::Placementmenu::reconfigure(void) { + setValues(); + Basemenu::reconfigure(); +} + + void Configmenu::Placementmenu::itemSelected(int button, unsigned int index) { if (button != 1) return; BasemenuItem *item = find(index); - if (!item->function()) + if (! item->function()) return; switch (item->function()) { diff --git a/src/Configmenu.hh b/src/Configmenu.hh index 101b021b..c3631fae 100644 --- a/src/Configmenu.hh +++ b/src/Configmenu.hh @@ -40,9 +40,11 @@ private: protected: virtual void itemSelected(int button, unsigned int index); + virtual void setValues(void); public: Focusmenu(Configmenu *cm); + virtual void reconfigure(void); }; class Placementmenu : public Basemenu { @@ -52,9 +54,11 @@ private: protected: virtual void itemSelected(int button, unsigned int index); + virtual void setValues(void); public: Placementmenu(Configmenu *cm); + virtual void reconfigure(void); }; Focusmenu *focusmenu; @@ -68,6 +72,7 @@ private: protected: virtual void itemSelected(int button, unsigned int index); + virtual void setValues(void); public: Configmenu(BScreen *scr); @@ -76,7 +81,7 @@ public: inline Basemenu *getFocusmenu(void) { return focusmenu; } inline Basemenu *getPlacementmenu(void) { return placementmenu; } - void reconfigure(void); + virtual void reconfigure(void); }; #endif // __Configmenu_hh diff --git a/src/Configuration.cc b/src/Configuration.cc new file mode 100644 index 00000000..e88e4601 --- /dev/null +++ b/src/Configuration.cc @@ -0,0 +1,238 @@ +// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*- +// Configuration.hh for Blackbox - an X11 Window manager +// Copyright (c) 2002 - 2002 Ben Jansens (ben@orodu.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. + +#include "../config.h" + +#include "Configuration.hh" +#include "Util.hh" + +#ifdef HAVE_STDLIB_H +# include +#endif // HAVE_STDLIB_H + +using std::string; + +bool Configuration::m_initialized = false; + +Configuration::Configuration(const string &file) { + setFile(file); + m_modified = false; + m_database = NULL; + m_autosave = true; + if (! m_initialized) { + XrmInitialize(); + m_initialized = true; + } +} + +Configuration::Configuration() { + m_modified = false; + m_database = NULL; + m_autosave = true; + if (! m_initialized) { + XrmInitialize(); + m_initialized = true; + } +} + +Configuration::~Configuration() { + if (m_database != NULL) + XrmDestroyDatabase(m_database); +} + +void Configuration::setFile(const string &file) { + m_file = file; +} + +void Configuration::setAutoSave(bool autosave) { + m_autosave = autosave; +} + +void Configuration::save() { + assert(m_database != NULL); + XrmPutFileDatabase(m_database, m_file.c_str()); + m_modified = false; +} + +bool Configuration::load() { + if (m_database != NULL) + XrmDestroyDatabase(m_database); + m_modified = false; + if (NULL == (m_database = XrmGetFileDatabase(m_file.c_str()))) + return false; + return true; +} + +void Configuration::create() { + if (m_database != NULL) + XrmDestroyDatabase(m_database); + m_modified = false; + assert(NULL != (m_database = XrmGetStringDatabase(""))); +} + +void Configuration::setValue(const string &rname, bool value) { + assert(m_database != NULL); + + const char *val = (value ? "True" : "False"); + string rc_string = rname + ": " + val; + XrmPutLineResource(&m_database, rc_string.c_str()); + + m_modified = true; + if (m_autosave) + save(); +} + +void Configuration::setValue(const string &rname, unsigned long value) { + assert(m_database != NULL); + + string rc_string = rname + ": " + itostring(value); + XrmPutLineResource(&m_database, rc_string.c_str()); + + m_modified = true; + if (m_autosave) + save(); +} + +void Configuration::setValue(const string &rname, long value) { + assert(m_database != NULL); + + string rc_string = rname + ": " + itostring(value); + XrmPutLineResource(&m_database, rc_string.c_str()); + + m_modified = true; + if (m_autosave) + save(); +} + +void Configuration::setValue(const string &rname, const char *value) { + assert(m_database != NULL); + assert(value != NULL); + + string rc_string = rname + ": " + value; + XrmPutLineResource(&m_database, rc_string.c_str()); + + m_modified = true; + if (m_autosave) + save(); +} + +void Configuration::setValue(const string &rname, const string &value) { + assert(m_database != NULL); + + string rc_string = rname + ": " + value; + XrmPutLineResource(&m_database, rc_string.c_str()); + + m_modified = true; + if (m_autosave) + save(); +} + +bool Configuration::getValue(const string &rname, bool &value) const { + assert(m_database != NULL); + + string rclass = createClassName(rname); + + char *rettype; + XrmValue retvalue; + if (0 == XrmGetResource(m_database, rname.c_str(), rclass.c_str(), + &rettype, &retvalue) || retvalue.addr == NULL) + return false; + string val = retvalue.addr; + if (val == "true" || val == "True") + value = true; + else + value = false; + return true; +} + +bool Configuration::getValue(const string &rname, long &value) const { + assert(m_database != NULL); + + string rclass = createClassName(rname); + + char *rettype; + XrmValue retvalue; + if (0 == XrmGetResource(m_database, rname.c_str(), rclass.c_str(), + &rettype, &retvalue) || retvalue.addr == NULL) + return false; + char *end; + value = strtol(retvalue.addr, &end, 10); + if (end == retvalue.addr) + return false; + return true; +} + +bool Configuration::getValue(const string &rname, unsigned long &value) const { + assert(m_database != NULL); + + string rclass = createClassName(rname); + + char *rettype; + XrmValue retvalue; + if (0 == XrmGetResource(m_database, rname.c_str(), rclass.c_str(), + &rettype, &retvalue) || retvalue.addr == NULL) + return false; + char *end; + value = strtoul(retvalue.addr, &end, 10); + if (end == retvalue.addr) + return false; + return true; +} + +bool Configuration::getValue(const string &rname, + string &value) const { + assert(m_database != NULL); + + string rclass = createClassName(rname); + + char *rettype; + XrmValue retvalue; + if (0 == XrmGetResource(m_database, rname.c_str(), rclass.c_str(), + &rettype, &retvalue) || retvalue.addr == NULL) + return false; + value = retvalue.addr; + return true; +} + + +string Configuration::createClassName(const string &rname) const { + string rclass(rname); + + string::iterator it = rclass.begin(), end = rclass.end(); + while (true) { + *it = toUpper(*it); + ++it; + if (it == end) break; + it = std::find(it, rclass.end(), '.'); + if (it == end) break; + ++it; + if (it == end) break; + } + return rclass; +} + + +char Configuration::toUpper(char c) const { + if (c >= 'a' && c <= 'z') + return c - 'a' + 'A'; + return c; +} diff --git a/src/Configuration.hh b/src/Configuration.hh new file mode 100644 index 00000000..6909c799 --- /dev/null +++ b/src/Configuration.hh @@ -0,0 +1,97 @@ +// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*- +// Configuration.hh for Blackbox - an X11 Window manager +// Copyright (c) 2002 - 2002 Ben Jansens (ben@orodu.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. + +#ifndef __Configuration_hh +#define __Configuration_hh + +#include +#include +#include + +/* + * The Configuration class is a generic wrapper for configuration settings. + * + * This class is used for the global rc/config file, and for styles. + * + * This implementation of the Configuration class wraps an X resource database + * file. + */ +class Configuration { +public: + explicit Configuration(const std::string &file); + Configuration(); + virtual ~Configuration(); + + inline const std::string &file() const { + return static_cast(m_file); + } + void setFile(const std::string &file); + + // defaults to true! + inline bool autoSave() const { + return m_autosave; + } + void setAutoSave(bool); + + inline bool isModified() const { + return m_modified; + } + + void save(); + bool load(); + void create(); + + void setValue(const std::string &rname, bool value); + inline void setValue(const std::string &rname, int value) { + setValue(rname, (long) value); + } + inline void setValue(const std::string &rname, unsigned int value) { + setValue(rname, (unsigned long) value); + } + void setValue(const std::string &rname, long value); + void setValue(const std::string &rname, unsigned long value); + void setValue(const std::string &rname, const std::string &value); + void setValue(const std::string &rname, const char *value); + + bool getValue(const std::string &rname, bool &value) const; + inline bool getValue(const std::string &rname, int &value) const { + return getValue(rname, (long) value); + } + inline bool getValue(const std::string &rname, unsigned int &value) const { + return getValue(rname, (unsigned long) value); + } + bool getValue(const std::string &rname, long &value) const; + bool getValue(const std::string &rname, unsigned long &value) const; + bool getValue(const std::string &rname, std::string &value) const; + +private: + std::string createClassName(const std::string &rname) const; + char toUpper(char) const; + + static bool m_initialized; + std::string m_file; + bool m_modified; + bool m_autosave; + XrmDatabase m_database; +}; + +#endif // __Configuration_hh diff --git a/src/ImageControl.cc b/src/ImageControl.cc index eed97734..9be8cf13 100644 --- a/src/ImageControl.cc +++ b/src/ImageControl.cc @@ -373,7 +373,7 @@ BImageControl::~BImageControl(void) { delete [] colors; } - if (!cache.empty()) { + if (! cache.empty()) { //#ifdef DEBUG fprintf(stderr, i18n(ImageSet, ImagePixmapRelease, "BImageContol::~BImageControl: pixmap cache - " @@ -432,7 +432,7 @@ Pixmap BImageControl::renderImage(unsigned int width, unsigned int height, BImage image(this, width, height); pixmap = image.render(texture); - if (!pixmap) + if (! pixmap) return None; CachedImage tmp; @@ -466,7 +466,7 @@ Pixmap BImageControl::renderImage(unsigned int width, unsigned int height, void BImageControl::removeImage(Pixmap pixmap) { - if (!pixmap) + if (! pixmap) return; CacheContainer::iterator it = cache.begin(); diff --git a/src/Makefile.am b/src/Makefile.am index 528798aa..637fa1d4 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -30,7 +30,7 @@ CPPFLAGS= @CPPFLAGS@ @SHAPE@ @ORDEREDPSEUDO@ \ bin_PROGRAMS= openbox -openbox_SOURCES= BaseDisplay.cc Basemenu.cc Clientmenu.cc Color.cc Configmenu.cc GCCache.cc Iconmenu.cc Image.cc ImageControl.cc Netizen.cc Rootmenu.cc Screen.cc Slit.cc Texture.cc Timer.cc Toolbar.cc Util.cc Window.cc Windowmenu.cc Workspace.cc Workspacemenu.cc blackbox.cc i18n.cc main.cc +openbox_SOURCES= BaseDisplay.cc Basemenu.cc Clientmenu.cc Color.cc Configmenu.cc Configuration.cc GCCache.cc Iconmenu.cc Image.cc ImageControl.cc Netizen.cc Rootmenu.cc Screen.cc Slit.cc Texture.cc Timer.cc Toolbar.cc Util.cc Window.cc Windowmenu.cc Workspace.cc Workspacemenu.cc blackbox.cc i18n.cc main.cc MAINTAINERCLEANFILES= Makefile.in @@ -39,87 +39,86 @@ distclean-local: # local dependencies -BaseDisplay.o: BaseDisplay.cc ../config.h i18n.hh \ - ../nls/blackbox-nls.hh BaseDisplay.hh Timer.hh GCCache.hh Color.hh \ - Util.hh -Basemenu.o: Basemenu.cc ../config.h i18n.hh ../nls/blackbox-nls.hh \ - blackbox.hh BaseDisplay.hh Timer.hh Basemenu.hh GCCache.hh Color.hh \ - Image.hh Screen.hh Texture.hh Util.hh Configmenu.hh Iconmenu.hh \ - Netizen.hh Rootmenu.hh Workspace.hh Workspacemenu.hh -Clientmenu.o: Clientmenu.cc ../config.h blackbox.hh i18n.hh \ - ../nls/blackbox-nls.hh BaseDisplay.hh Timer.hh Clientmenu.hh \ - Basemenu.hh Screen.hh Color.hh Texture.hh Util.hh Configmenu.hh \ - Iconmenu.hh Netizen.hh Rootmenu.hh Workspace.hh Workspacemenu.hh \ - Window.hh Windowmenu.hh -Color.o: Color.cc ../config.h Color.hh BaseDisplay.hh Timer.hh -Configmenu.o: Configmenu.cc ../config.h i18n.hh ../nls/blackbox-nls.hh \ - Configmenu.hh Basemenu.hh Image.hh Timer.hh BaseDisplay.hh Color.hh \ - Toolbar.hh Screen.hh Texture.hh Util.hh Iconmenu.hh Netizen.hh \ - Rootmenu.hh Workspace.hh Workspacemenu.hh blackbox.hh Window.hh \ - Windowmenu.hh -GCCache.o: GCCache.cc ../config.h GCCache.hh BaseDisplay.hh Timer.hh \ - Color.hh Util.hh -Iconmenu.o: Iconmenu.cc ../config.h i18n.hh ../nls/blackbox-nls.hh \ - Iconmenu.hh Basemenu.hh Screen.hh Color.hh Texture.hh Util.hh \ - Configmenu.hh Netizen.hh Rootmenu.hh Timer.hh Workspace.hh \ - Workspacemenu.hh blackbox.hh BaseDisplay.hh Window.hh Windowmenu.hh -Image.o: Image.cc ../config.h blackbox.hh i18n.hh \ - ../nls/blackbox-nls.hh BaseDisplay.hh Timer.hh GCCache.hh Color.hh \ - Image.hh Texture.hh Util.hh -ImageControl.o: ImageControl.cc ../config.h blackbox.hh i18n.hh \ - ../nls/blackbox-nls.hh BaseDisplay.hh Timer.hh Color.hh Image.hh \ - Texture.hh Util.hh -Netizen.o: Netizen.cc ../config.h Netizen.hh Screen.hh Color.hh \ - Texture.hh Util.hh Configmenu.hh Basemenu.hh Iconmenu.hh Rootmenu.hh \ - Timer.hh Workspace.hh Workspacemenu.hh blackbox.hh i18n.hh \ - ../nls/blackbox-nls.hh BaseDisplay.hh -Rootmenu.o: Rootmenu.cc ../config.h blackbox.hh i18n.hh \ - ../nls/blackbox-nls.hh BaseDisplay.hh Timer.hh Rootmenu.hh \ - Basemenu.hh Screen.hh Color.hh Texture.hh Util.hh Configmenu.hh \ - Iconmenu.hh Netizen.hh Workspace.hh Workspacemenu.hh -Screen.o: Screen.cc ../config.h i18n.hh ../nls/blackbox-nls.hh \ - blackbox.hh BaseDisplay.hh Timer.hh Clientmenu.hh Basemenu.hh \ - GCCache.hh Color.hh Iconmenu.hh Image.hh Screen.hh Texture.hh Util.hh \ - Configmenu.hh Netizen.hh Rootmenu.hh Workspace.hh Workspacemenu.hh \ - Slit.hh Toolbar.hh Window.hh Windowmenu.hh -Slit.o: Slit.cc ../config.h i18n.hh ../nls/blackbox-nls.hh blackbox.hh \ - BaseDisplay.hh Timer.hh Image.hh Color.hh Screen.hh Texture.hh \ - Util.hh Configmenu.hh Basemenu.hh Iconmenu.hh Netizen.hh Rootmenu.hh \ - Workspace.hh Workspacemenu.hh Slit.hh Toolbar.hh -Texture.o: Texture.cc ../config.h Texture.hh Color.hh Util.hh \ - BaseDisplay.hh Timer.hh Image.hh Screen.hh Configmenu.hh Basemenu.hh \ - Iconmenu.hh Netizen.hh Rootmenu.hh Workspace.hh Workspacemenu.hh \ - blackbox.hh i18n.hh ../nls/blackbox-nls.hh -Timer.o: Timer.cc ../config.h BaseDisplay.hh Timer.hh Util.hh -Toolbar.o: Toolbar.cc ../config.h i18n.hh ../nls/blackbox-nls.hh \ - blackbox.hh BaseDisplay.hh Timer.hh Clientmenu.hh Basemenu.hh \ - GCCache.hh Color.hh Iconmenu.hh Image.hh Rootmenu.hh Screen.hh \ - Texture.hh Util.hh Configmenu.hh Netizen.hh Workspace.hh \ - Workspacemenu.hh Toolbar.hh Window.hh Windowmenu.hh Slit.hh -Util.o: Util.cc ../config.h Util.hh -Window.o: Window.cc ../config.h i18n.hh ../nls/blackbox-nls.hh \ - blackbox.hh BaseDisplay.hh Timer.hh GCCache.hh Color.hh Iconmenu.hh \ - Basemenu.hh Image.hh Screen.hh Texture.hh Util.hh Configmenu.hh \ - Netizen.hh Rootmenu.hh Workspace.hh Workspacemenu.hh Toolbar.hh \ - Window.hh Windowmenu.hh Slit.hh -Windowmenu.o: Windowmenu.cc ../config.h i18n.hh ../nls/blackbox-nls.hh \ - blackbox.hh BaseDisplay.hh Timer.hh Screen.hh Color.hh Texture.hh \ - Util.hh Configmenu.hh Basemenu.hh Iconmenu.hh Netizen.hh Rootmenu.hh \ - Workspace.hh Workspacemenu.hh Window.hh Windowmenu.hh -Workspace.o: Workspace.cc ../config.h i18n.hh ../nls/blackbox-nls.hh \ - blackbox.hh BaseDisplay.hh Timer.hh Clientmenu.hh Basemenu.hh \ - Netizen.hh Screen.hh Color.hh Texture.hh Util.hh Configmenu.hh \ - Iconmenu.hh Rootmenu.hh Workspace.hh Workspacemenu.hh Toolbar.hh \ - Window.hh Windowmenu.hh -Workspacemenu.o: Workspacemenu.cc ../config.h i18n.hh \ - ../nls/blackbox-nls.hh blackbox.hh BaseDisplay.hh Timer.hh Screen.hh \ - Color.hh Texture.hh Util.hh Configmenu.hh Basemenu.hh Iconmenu.hh \ - Netizen.hh Rootmenu.hh Workspace.hh Workspacemenu.hh Toolbar.hh -blackbox.o: blackbox.cc ../config.h i18n.hh ../nls/blackbox-nls.hh \ - blackbox.hh BaseDisplay.hh Timer.hh Basemenu.hh Clientmenu.hh \ - GCCache.hh Color.hh Image.hh Rootmenu.hh Screen.hh Texture.hh Util.hh \ - Configmenu.hh Iconmenu.hh Netizen.hh Workspace.hh Workspacemenu.hh \ - Slit.hh Toolbar.hh Window.hh Windowmenu.hh -i18n.o: i18n.cc ../config.h i18n.hh ../nls/blackbox-nls.hh -main.o: main.cc ../version.h ../config.h i18n.hh \ - ../nls/blackbox-nls.hh blackbox.hh BaseDisplay.hh Timer.hh +BaseDisplay.o: BaseDisplay.cc i18n.hh ../nls/blackbox-nls.hh \ + BaseDisplay.hh Timer.hh Util.hh GCCache.hh Color.hh +Basemenu.o: Basemenu.cc i18n.hh ../nls/blackbox-nls.hh blackbox.hh \ + BaseDisplay.hh Timer.hh Util.hh Configuration.hh Basemenu.hh GCCache.hh \ + Color.hh Image.hh Screen.hh Texture.hh Configmenu.hh Iconmenu.hh \ + Netizen.hh Rootmenu.hh Workspace.hh Workspacemenu.hh +Clientmenu.o: Clientmenu.cc blackbox.hh i18n.hh ../nls/blackbox-nls.hh \ + BaseDisplay.hh Timer.hh Util.hh Configuration.hh Clientmenu.hh \ + Basemenu.hh Screen.hh Color.hh Texture.hh Image.hh Configmenu.hh \ + Iconmenu.hh Netizen.hh Rootmenu.hh Workspace.hh Workspacemenu.hh \ + Window.hh Windowmenu.hh +Color.o: Color.cc Color.hh BaseDisplay.hh Timer.hh Util.hh +Configmenu.o: Configmenu.cc i18n.hh ../nls/blackbox-nls.hh Configmenu.hh \ + Basemenu.hh Image.hh Timer.hh BaseDisplay.hh Util.hh Color.hh \ + Toolbar.hh Screen.hh Texture.hh Iconmenu.hh Netizen.hh Rootmenu.hh \ + Workspace.hh Workspacemenu.hh blackbox.hh Configuration.hh Window.hh \ + Windowmenu.hh +Configuration.o: Configuration.cc ../config.h Configuration.hh Util.hh +GCCache.o: GCCache.cc GCCache.hh BaseDisplay.hh Timer.hh Util.hh Color.hh +Iconmenu.o: Iconmenu.cc i18n.hh ../nls/blackbox-nls.hh Iconmenu.hh \ + Basemenu.hh Screen.hh Color.hh Texture.hh Util.hh Image.hh Timer.hh \ + BaseDisplay.hh Configmenu.hh Netizen.hh Rootmenu.hh Workspace.hh \ + Workspacemenu.hh blackbox.hh Configuration.hh Window.hh Windowmenu.hh +Image.o: Image.cc blackbox.hh i18n.hh ../nls/blackbox-nls.hh \ + BaseDisplay.hh Timer.hh Util.hh Configuration.hh GCCache.hh Color.hh \ + Image.hh Texture.hh +ImageControl.o: ImageControl.cc blackbox.hh i18n.hh \ + ../nls/blackbox-nls.hh BaseDisplay.hh Timer.hh Util.hh Configuration.hh \ + Color.hh Image.hh Texture.hh +Netizen.o: Netizen.cc Netizen.hh Screen.hh Color.hh Texture.hh Util.hh \ + Image.hh Timer.hh BaseDisplay.hh Configmenu.hh Basemenu.hh Iconmenu.hh \ + Rootmenu.hh Workspace.hh Workspacemenu.hh blackbox.hh i18n.hh \ + ../nls/blackbox-nls.hh Configuration.hh +Rootmenu.o: Rootmenu.cc blackbox.hh i18n.hh ../nls/blackbox-nls.hh \ + BaseDisplay.hh Timer.hh Util.hh Configuration.hh Rootmenu.hh \ + Basemenu.hh Screen.hh Color.hh Texture.hh Image.hh Configmenu.hh \ + Iconmenu.hh Netizen.hh Workspace.hh Workspacemenu.hh +Screen.o: Screen.cc i18n.hh ../nls/blackbox-nls.hh blackbox.hh \ + BaseDisplay.hh Timer.hh Util.hh Configuration.hh Clientmenu.hh \ + Basemenu.hh GCCache.hh Color.hh Iconmenu.hh Image.hh Screen.hh \ + Texture.hh Configmenu.hh Netizen.hh Rootmenu.hh Workspace.hh \ + Workspacemenu.hh Slit.hh Toolbar.hh Window.hh Windowmenu.hh +Slit.o: Slit.cc i18n.hh ../nls/blackbox-nls.hh blackbox.hh BaseDisplay.hh \ + Timer.hh Util.hh Configuration.hh Image.hh Color.hh Screen.hh \ + Texture.hh Configmenu.hh Basemenu.hh Iconmenu.hh Netizen.hh Rootmenu.hh \ + Workspace.hh Workspacemenu.hh Slit.hh Toolbar.hh +Texture.o: Texture.cc Texture.hh Color.hh Util.hh BaseDisplay.hh Timer.hh \ + Image.hh Screen.hh Configmenu.hh Basemenu.hh Iconmenu.hh Netizen.hh \ + Rootmenu.hh Workspace.hh Workspacemenu.hh blackbox.hh i18n.hh \ + ../nls/blackbox-nls.hh Configuration.hh +Timer.o: Timer.cc BaseDisplay.hh Timer.hh Util.hh +Toolbar.o: Toolbar.cc i18n.hh ../nls/blackbox-nls.hh blackbox.hh \ + BaseDisplay.hh Timer.hh Util.hh Configuration.hh Clientmenu.hh \ + Basemenu.hh GCCache.hh Color.hh Iconmenu.hh Image.hh Rootmenu.hh \ + Screen.hh Texture.hh Configmenu.hh Netizen.hh Workspace.hh \ + Workspacemenu.hh Toolbar.hh Window.hh Windowmenu.hh Slit.hh +Util.o: Util.cc Util.hh +Window.o: Window.cc i18n.hh ../nls/blackbox-nls.hh blackbox.hh \ + BaseDisplay.hh Timer.hh Util.hh Configuration.hh GCCache.hh Color.hh \ + Iconmenu.hh Basemenu.hh Image.hh Screen.hh Texture.hh Configmenu.hh \ + Netizen.hh Rootmenu.hh Workspace.hh Workspacemenu.hh Toolbar.hh \ + Window.hh Windowmenu.hh Slit.hh +Windowmenu.o: Windowmenu.cc i18n.hh ../nls/blackbox-nls.hh blackbox.hh \ + BaseDisplay.hh Timer.hh Util.hh Configuration.hh Screen.hh Color.hh \ + Texture.hh Image.hh Configmenu.hh Basemenu.hh Iconmenu.hh Netizen.hh \ + Rootmenu.hh Workspace.hh Workspacemenu.hh Window.hh Windowmenu.hh +Workspace.o: Workspace.cc i18n.hh ../nls/blackbox-nls.hh blackbox.hh \ + BaseDisplay.hh Timer.hh Util.hh Configuration.hh Clientmenu.hh \ + Basemenu.hh Netizen.hh Screen.hh Color.hh Texture.hh Image.hh \ + Configmenu.hh Iconmenu.hh Rootmenu.hh Workspace.hh Workspacemenu.hh \ + Toolbar.hh Window.hh Windowmenu.hh +Workspacemenu.o: Workspacemenu.cc i18n.hh ../nls/blackbox-nls.hh \ + blackbox.hh BaseDisplay.hh Timer.hh Util.hh Configuration.hh Screen.hh \ + Color.hh Texture.hh Image.hh Configmenu.hh Basemenu.hh Iconmenu.hh \ + Netizen.hh Rootmenu.hh Workspace.hh Workspacemenu.hh Toolbar.hh +blackbox.o: blackbox.cc i18n.hh ../nls/blackbox-nls.hh blackbox.hh \ + BaseDisplay.hh Timer.hh Util.hh Configuration.hh Basemenu.hh \ + Clientmenu.hh GCCache.hh Color.hh Image.hh Rootmenu.hh Screen.hh \ + Texture.hh Configmenu.hh Iconmenu.hh Netizen.hh Workspace.hh \ + Workspacemenu.hh Slit.hh Toolbar.hh Window.hh Windowmenu.hh +i18n.o: i18n.cc i18n.hh ../nls/blackbox-nls.hh +main.o: main.cc ../version.h i18n.hh ../nls/blackbox-nls.hh blackbox.hh \ + BaseDisplay.hh Timer.hh Util.hh Configuration.hh diff --git a/src/Rootmenu.cc b/src/Rootmenu.cc index 3fbc844c..148c1fca 100644 --- a/src/Rootmenu.cc +++ b/src/Rootmenu.cc @@ -58,7 +58,7 @@ void Rootmenu::itemSelected(int button, unsigned int index) { BasemenuItem *item = find(index); - if (!item->function()) + if (! item->function()) return; switch (item->function()) { diff --git a/src/Screen.cc b/src/Screen.cc index 27b494af..2f7e684f 100644 --- a/src/Screen.cc +++ b/src/Screen.cc @@ -108,6 +108,8 @@ static int anotherWMRunning(Display *display, XErrorEvent *) { BScreen::BScreen(Blackbox *bb, unsigned int scrn) : ScreenInfo(bb, scrn) { blackbox = bb; + screenstr = (string)"session.screen" + itostring(scrn) + '.'; + config = blackbox->getConfig(); event_mask = ColormapChangeMask | EnterWindowMask | PropertyChangeMask | SubstructureRedirectMask | ButtonPressMask | ButtonReleaseMask; @@ -127,7 +129,6 @@ BScreen::BScreen(Blackbox *bb, unsigned int scrn) : ScreenInfo(bb, scrn) { getDepth()); rootmenu = 0; - resource.stylerc = 0; resource.mstyle.t_fontset = resource.mstyle.f_fontset = resource.tstyle.fontset = resource.wstyle.fontset = (XFontSet) 0; @@ -155,10 +156,7 @@ BScreen::BScreen(Blackbox *bb, unsigned int scrn) : ScreenInfo(bb, scrn) { image_control->installRootColormap(); root_colormap_installed = True; - blackbox->load_rc(this); - - image_control->setDither(resource.image_dither); - + load_rc(); LoadStyle(); XGCValues gcv; @@ -351,9 +349,262 @@ BScreen::~BScreen(void) { void BScreen::removeWorkspaceNames(void) { workspaceNames.clear(); } + +void BScreen::saveSloppyFocus(bool s) { + resource.sloppy_focus = s; + + string fmodel; + if (resource.sloppy_focus) { + fmodel = "SloppyFocus"; + if (resource.auto_raise) fmodel += " AutoRaise"; + if (resource.click_raise) fmodel += " ClickRaise"; + } else { + fmodel = "ClickToFocus"; + } + config->setValue(screenstr + "focusModel", fmodel); +} + + +void BScreen::saveAutoRaise(bool a) { + resource.auto_raise = a; + saveSloppyFocus(resource.sloppy_focus); +} + + +void BScreen::saveClickRaise(bool c) { + resource.click_raise = c; + saveSloppyFocus(resource.sloppy_focus); +} + + +void BScreen::saveImageDither(bool d) { + image_control->setDither(d); + config->setValue(screenstr + "imageDither", doImageDither()); +} + + +void BScreen::saveOpaqueMove(bool o) { + resource.opaque_move = o; + config->setValue(screenstr + "opaqueMove", resource.opaque_move); +} + + +void BScreen::saveFullMax(bool f) { + resource.full_max = f; + config->setValue(screenstr + "fullMaximization", resource.full_max); +} + + +void BScreen::saveFocusNew(bool f) { + resource.focus_new = f; + config->setValue(screenstr + "focusNewWindows", resource.focus_new); +} + + +void BScreen::saveFocusLast(bool f) { + resource.focus_last = f; + config->setValue(screenstr + "focusLastWindow", resource.focus_last); +} + + +void BScreen::saveWorkspaces(unsigned int w) { + resource.workspaces = w; + config->setValue(screenstr + "workspaces", resource.workspaces); +} + + +void BScreen::savePlacementPolicy(int p) { + resource.placement_policy = p; + const char *placement; + switch (resource.placement_policy) { + case CascadePlacement: placement = "CascadePlacement"; break; + case ColSmartPlacement: placement = "ColSmartPlacement"; break; + case RowSmartPlacement: default: placement = "RowSmartPlacement"; break; + } + config->setValue(screenstr + "windowPlacement", placement); +} + + +void BScreen::saveEdgeSnapThreshold(int t) { + resource.edge_snap_threshold = t; + config->setValue(screenstr + "edgeSnapThreshold", + resource.edge_snap_threshold); +} + + +void BScreen::saveRowPlacementDirection(int d) { + resource.row_direction = d; + config->setValue(screenstr + "rowPlacementDirection", + resource.row_direction == LeftRight ? + "LeftToRight" : "RightToLeft"); +} + + +void BScreen::saveColPlacementDirection(int d) { + resource.col_direction = d; + config->setValue(screenstr + "colPlacementDirection", + resource.col_direction == TopBottom ? + "TopToBottom" : "BottomToTop"); +} + + +#ifdef HAVE_STRFTIME +void BScreen::saveStrftimeFormat(const std::string& format) { + resource.strftime_format = format; + config->setValue(screenstr + "strftimeFormat", resource.strftime_format); +} + +#else // !HAVE_STRFTIME + +void BScreen::saveDateFormat(int f) { + resource.date_format = f; + config->setValue(screenstr + "dateFormat", + resource.date_format == B_EuropeanDate ? + "European" : "American"); +} + + +void BScreen::saveClock24Hour(Bool c) { + resource.clock24hour = c; + config->setValue(screenstr + "clockFormat", resource.clock24hour ? 24 : 12); +} +#endif // HAVE_STRFTIME + + +void BScreen::saveWorkspaceNames() { + string save_string = getWorkspace(0)->getName(); + for (unsigned int i = 1; i < getWorkspaceCount(); ++i) + save_string += ',' + getWorkspace(i)->getName(); + config->setValue(screenstr + "workspaceNames", save_string); +} + + +void BScreen::save_rc(void) { + saveSloppyFocus(resource.sloppy_focus); + saveAutoRaise(resource.auto_raise); + saveImageDither(doImageDither()); + saveOpaqueMove(resource.opaque_move); + saveFullMax(resource.full_max); + saveFocusNew(resource.focus_new); + saveFocusLast(resource.focus_last); + saveWorkspaces(resource.workspaces); + savePlacementPolicy(resource.placement_policy); + saveEdgeSnapThreshold(resource.edge_snap_threshold); + saveRowPlacementDirection(resource.row_direction); + saveColPlacementDirection(resource.col_direction); +#ifdef HAVE_STRFTIME + saveStrftimeFormat(resource.strftime_format); +#else // !HAVE_STRFTIME + saveDateFormat(resource.date_format); + savwClock24Hour(resource.clock24hour); +#endif // HAVE_STRFTIME + + toolbar->save_rc(); + slit->save_rc(); +} + + +void BScreen::load_rc(void) { + std::string s; + bool b; + + if (! config->getValue(screenstr + "fullMaximization", resource.full_max)) + resource.full_max = false; + + if (! config->getValue(screenstr + "focusNewWindows", resource.focus_new)) + resource.focus_new = false; + + if (! config->getValue(screenstr + "focusLastWindow", resource.focus_last)) + resource.focus_last = false; + + if (! config->getValue(screenstr + "workspaces", resource.workspaces)) + resource.workspaces = 1; + + if (! config->getValue(screenstr + "opaqueMove", resource.opaque_move)) + resource.opaque_move = false; + + if (! config->getValue(screenstr + "imageDither", b)) + b = true; + image_control->setDither(b); + + if (! config->getValue(screenstr + "edgeSnapThreshold", + resource.edge_snap_threshold)) + resource.edge_snap_threshold = 4; + + if (config->getValue(screenstr + "rowPlacementDirection", s) && + s == "RightToLeft") + resource.row_direction = RightLeft; + else + resource.row_direction = LeftRight; + + if (config->getValue(screenstr + "colPlacementDirection", s) && + s == "BottomToTop") + resource.col_direction = BottomTop; + else + resource.col_direction = TopBottom; + + removeWorkspaceNames(); + if (config->getValue(screenstr + "workspaceNames", s)) { + string::const_iterator it = s.begin(), end = s.end(); + while(1) { + string::const_iterator tmp = it; // current string.begin() + it = std::find(tmp, end, ','); // look for comma between tmp and end + addWorkspaceName(string(tmp, it)); // s[tmp:it] + if (it == end) + break; + ++it; + } + } + + resource.sloppy_focus = true; + resource.auto_raise = false; + resource.click_raise = false; + if (config->getValue(screenstr + "focusModel", s)) { + if (s.find("ClickToFocus") != string::npos) { + resource.sloppy_focus = false; + } else { + // must be sloppy + if (s.find("AutoRaise") != string::npos) + resource.auto_raise = true; + if (s.find("ClickRaise") != string::npos) + resource.click_raise = true; + } + } + + if (config->getValue(screenstr + "windowPlacement", s)) { + if (s == "CascadePlacement") + resource.placement_policy = CascadePlacement; + else if (s == "ColSmartPlacement") + resource.placement_policy = ColSmartPlacement; + else //if (s == "RowSmartPlacement") + resource.placement_policy = RowSmartPlacement; + } else + resource.placement_policy = RowSmartPlacement; + +#ifdef HAVE_STRFTIME + if (config->getValue(screenstr + "strftimeFormat", s)) + resource.strftime_format = s; + else + resource.strftime_format = "%I:%M %p"; +#else // !HAVE_STRFTIME + long l; + + if (config->getValue(screenstr + "dateFormat", s) && s == "European") + resource.date_format = B_EuropeanDate; + else + resource.date_format = B_AmericanDate; + + if (! config->getValue(screenstr + "clockFormat", l)) + l = 12; + resource.clock24hour = l == 24; +#endif // HAVE_STRFTIME +} void BScreen::reconfigure(void) { + load_rc(); + toolbar->load_rc(); + slit->load_rc(); LoadStyle(); XGCValues gcv; @@ -442,12 +693,19 @@ void BScreen::rereadMenu(void) { void BScreen::LoadStyle(void) { - resource.stylerc = XrmGetFileDatabase(blackbox->getStyleFilename()); - if (! resource.stylerc) - resource.stylerc = XrmGetFileDatabase(DEFAULTSTYLE); + Configuration style; + + const char *sfile = blackbox->getStyleFilename(); + if (sfile != NULL) { + style.setFile(sfile); + if (! style.load()) { + style.setFile(DEFAULTSTYLE); + if (! style.load()) + style.create(); // hardcoded default values will be used. + } + } - XrmValue value; - char *value_type; + string s; // load fonts/fontsets if (resource.wstyle.fontset) @@ -476,14 +734,10 @@ void BScreen::LoadStyle(void) { resource.mstyle.t_font = 0; if (i18n.multibyte()) { - resource.wstyle.fontset = - readDatabaseFontSet("window.font", "Window.Font"); - resource.tstyle.fontset = - readDatabaseFontSet("toolbar.font", "Toolbar.Font"); - resource.mstyle.t_fontset = - readDatabaseFontSet("menu.title.font", "Menu.Title.Font"); - resource.mstyle.f_fontset = - readDatabaseFontSet("menu.frame.font", "Menu.Frame.Font"); + resource.wstyle.fontset = readDatabaseFontSet("window.font", style); + resource.tstyle.fontset = readDatabaseFontSet("toolbar.font", style); + resource.mstyle.t_fontset = readDatabaseFontSet("menu.title.font", style); + resource.mstyle.f_fontset = readDatabaseFontSet("menu.frame.font", style); resource.mstyle.t_fontset_extents = XExtentsOfFontSet(resource.mstyle.t_fontset); @@ -494,207 +748,155 @@ void BScreen::LoadStyle(void) { resource.wstyle.fontset_extents = XExtentsOfFontSet(resource.wstyle.fontset); } else { - resource.wstyle.font = - readDatabaseFont("window.font", "Window.Font"); - resource.tstyle.font = - readDatabaseFont("toolbar.font", "Toolbar.Font"); - resource.mstyle.t_font = - readDatabaseFont("menu.title.font", "Menu.Title.Font"); - resource.mstyle.f_font = - readDatabaseFont("menu.frame.font", "Menu.Frame.Font"); + resource.wstyle.font = readDatabaseFont("window.font", style); + resource.tstyle.font = readDatabaseFont("toolbar.font", style); + resource.mstyle.t_font = readDatabaseFont("menu.title.font", style); + resource.mstyle.f_font = readDatabaseFont("menu.frame.font", style); } // load window config resource.wstyle.t_focus = - readDatabaseTexture("window.title.focus", "Window.Title.Focus", "white"); + readDatabaseTexture("window.title.focus", "white", style); resource.wstyle.t_unfocus = - readDatabaseTexture("window.title.unfocus", - "Window.Title.Unfocus", "black"); + readDatabaseTexture("window.title.unfocus", "black", style); resource.wstyle.l_focus = - readDatabaseTexture("window.label.focus", "Window.Label.Focus", "white" ); + readDatabaseTexture("window.label.focus", "white", style); resource.wstyle.l_unfocus = - readDatabaseTexture("window.label.unfocus", "Window.Label.Unfocus", - "black"); + readDatabaseTexture("window.label.unfocus", "black", style); resource.wstyle.h_focus = - readDatabaseTexture("window.handle.focus", "Window.Handle.Focus", "white"); + readDatabaseTexture("window.handle.focus", "white", style); resource.wstyle.h_unfocus = - readDatabaseTexture("window.handle.unfocus", - "Window.Handle.Unfocus", "black"); + readDatabaseTexture("window.handle.unfocus", "black", style); resource.wstyle.g_focus = - readDatabaseTexture("window.grip.focus", "Window.Grip.Focus", "white"); + readDatabaseTexture("window.grip.focus", "white", style); resource.wstyle.g_unfocus = - readDatabaseTexture("window.grip.unfocus", "Window.Grip.Unfocus", "black"); + readDatabaseTexture("window.grip.unfocus", "black", style); resource.wstyle.b_focus = - readDatabaseTexture("window.button.focus", "Window.Button.Focus", "white"); + readDatabaseTexture("window.button.focus", "white", style); resource.wstyle.b_unfocus = - readDatabaseTexture("window.button.unfocus", - "Window.Button.Unfocus", "black"); + readDatabaseTexture("window.button.unfocus", "black", style); resource.wstyle.b_pressed = - readDatabaseTexture("window.button.pressed", - "Window.Button.Pressed", "black"); + readDatabaseTexture("window.button.pressed", "black", style); resource.wstyle.f_focus = - readDatabaseColor("window.frame.focusColor", - "Window.Frame.FocusColor", "white"); + readDatabaseColor("window.frame.focusColor", "white", style); resource.wstyle.f_unfocus = - readDatabaseColor("window.frame.unfocusColor", - "Window.Frame.UnfocusColor", "black"); + readDatabaseColor("window.frame.unfocusColor", "black", style); resource.wstyle.l_text_focus = - readDatabaseColor("window.label.focus.textColor", - "Window.Label.Focus.TextColor", "black"); + readDatabaseColor("window.label.focus.textColor", "black", style); resource.wstyle.l_text_unfocus = - readDatabaseColor("window.label.unfocus.textColor", - "Window.Label.Unfocus.TextColor", "white"); + readDatabaseColor("window.label.unfocus.textColor", "white", style); resource.wstyle.b_pic_focus = - readDatabaseColor("window.button.focus.picColor", - "Window.Button.Focus.PicColor", "black"); + readDatabaseColor("window.button.focus.picColor", "black", style); resource.wstyle.b_pic_unfocus = - readDatabaseColor("window.button.unfocus.picColor", - "Window.Button.Unfocus.PicColor", "white"); + readDatabaseColor("window.button.unfocus.picColor", "white", style); resource.wstyle.justify = LeftJustify; - if (XrmGetResource(resource.stylerc, "window.justify", "Window.Justify", - &value_type, &value)) { - if (strstr(value.addr, "right") || strstr(value.addr, "Right")) + if (style.getValue("window.justify", s)) { + if (s == "right" || s == "Right") resource.wstyle.justify = RightJustify; - else if (strstr(value.addr, "center") || strstr(value.addr, "Center")) + else if (s == "center" || s == "Center") resource.wstyle.justify = CenterJustify; } // load toolbar config resource.tstyle.toolbar = - readDatabaseTexture("toolbar", "Toolbar", "black"); + readDatabaseTexture("toolbar", "black", style); resource.tstyle.label = - readDatabaseTexture("toolbar.label", "Toolbar.Label", "black"); + readDatabaseTexture("toolbar.label", "black", style); resource.tstyle.window = - readDatabaseTexture("toolbar.windowLabel", "Toolbar.WindowLabel", "black"); + readDatabaseTexture("toolbar.windowLabel", "black", style); resource.tstyle.button = - readDatabaseTexture("toolbar.button", "Toolbar.Button", "white"); + readDatabaseTexture("toolbar.button", "white", style); resource.tstyle.pressed = - readDatabaseTexture("toolbar.button.pressed", - "Toolbar.Button.Pressed", "black"); + readDatabaseTexture("toolbar.button.pressed", "black", style); resource.tstyle.clock = - readDatabaseTexture("toolbar.clock", "Toolbar.Clock", "black"); + readDatabaseTexture("toolbar.clock", "black", style); resource.tstyle.l_text = - readDatabaseColor("toolbar.label.textColor", - "Toolbar.Label.TextColor", "white"); + readDatabaseColor("toolbar.label.textColor", "white", style); resource.tstyle.w_text = - readDatabaseColor("toolbar.windowLabel.textColor", - "Toolbar.WindowLabel.TextColor", "white"); + readDatabaseColor("toolbar.windowLabel.textColor", "white", style); resource.tstyle.c_text = - readDatabaseColor("toolbar.clock.textColor", - "Toolbar.Clock.TextColor", "white"); + readDatabaseColor("toolbar.clock.textColor", "white", style); resource.tstyle.b_pic = - readDatabaseColor("toolbar.button.picColor", - "Toolbar.Button.PicColor", "black"); + readDatabaseColor("toolbar.button.picColor", "black", style); resource.tstyle.justify = LeftJustify; - if (XrmGetResource(resource.stylerc, "toolbar.justify", - "Toolbar.Justify", &value_type, &value)) { - if (strstr(value.addr, "right") || strstr(value.addr, "Right")) + if (style.getValue("toolbar.justify", s)) { + if (s == "right" || s == "Right") resource.tstyle.justify = RightJustify; - else if (strstr(value.addr, "center") || strstr(value.addr, "Center")) + else if (s == "center" || s == "Center") resource.tstyle.justify = CenterJustify; } // load menu config resource.mstyle.title = - readDatabaseTexture("menu.title", "Menu.Title", "white"); + readDatabaseTexture("menu.title", "white", style); resource.mstyle.frame = - readDatabaseTexture("menu.frame", "Menu.Frame", "black"); + readDatabaseTexture("menu.frame", "black", style); resource.mstyle.hilite = - readDatabaseTexture("menu.hilite", "Menu.Hilite", "white"); + readDatabaseTexture("menu.hilite", "white", style); resource.mstyle.t_text = - readDatabaseColor("menu.title.textColor", "Menu.Title.TextColor", "black"); + readDatabaseColor("menu.title.textColor", "black", style); resource.mstyle.f_text = - readDatabaseColor("menu.frame.textColor", "Menu.Frame.TextColor", "white"); + readDatabaseColor("menu.frame.textColor", "white", style); resource.mstyle.d_text = - readDatabaseColor("menu.frame.disableColor", - "Menu.Frame.DisableColor", "black"); + readDatabaseColor("menu.frame.disableColor", "black", style); resource.mstyle.h_text = - readDatabaseColor("menu.hilite.textColor", - "Menu.Hilite.TextColor", "black"); + readDatabaseColor("menu.hilite.textColor", "black", style); resource.mstyle.t_justify = LeftJustify; - if (XrmGetResource(resource.stylerc, "menu.title.justify", - "Menu.Title.Justify", - &value_type, &value)) { - if (strstr(value.addr, "right") || strstr(value.addr, "Right")) + if (style.getValue("menu.title.justify", s)) { + if (s == "right" || s == "Right") resource.mstyle.t_justify = RightJustify; - else if (strstr(value.addr, "center") || strstr(value.addr, "Center")) + else if (s == "center" || s == "Center") resource.mstyle.t_justify = CenterJustify; } resource.mstyle.f_justify = LeftJustify; - if (XrmGetResource(resource.stylerc, "menu.frame.justify", - "Menu.Frame.Justify", - &value_type, &value)) { - if (strstr(value.addr, "right") || strstr(value.addr, "Right")) + if (style.getValue("menu.frame.justify", s)) { + if (s == "right" || s == "Right") resource.mstyle.f_justify = RightJustify; - else if (strstr(value.addr, "center") || strstr(value.addr, "Center")) + else if (s == "center" || s == "Center") resource.mstyle.f_justify = CenterJustify; } resource.mstyle.bullet = Basemenu::Triangle; - if (XrmGetResource(resource.stylerc, "menu.bullet", "Menu.Bullet", - &value_type, &value)) { - if (! strncasecmp(value.addr, "empty", value.size)) + if (style.getValue("menu.bullet", s)) { + if (s == "empty" || s == "Empty") resource.mstyle.bullet = Basemenu::Empty; - else if (! strncasecmp(value.addr, "square", value.size)) + else if (s == "square" || s == "Square") resource.mstyle.bullet = Basemenu::Square; - else if (! strncasecmp(value.addr, "diamond", value.size)) + else if (s == "diamond" || s == "Diamond") resource.mstyle.bullet = Basemenu::Diamond; } resource.mstyle.bullet_pos = Basemenu::Left; - if (XrmGetResource(resource.stylerc, "menu.bullet.position", - "Menu.Bullet.Position", &value_type, &value)) { - if (! strncasecmp(value.addr, "right", value.size)) + if (style.getValue("menu.bullet.position", s)) { + if (s == "right" || s == "Right") resource.mstyle.bullet_pos = Basemenu::Right; } resource.border_color = - readDatabaseColor("borderColor", "BorderColor", "black"); - - unsigned int uint_value; + readDatabaseColor("borderColor", "black", style); // load bevel, border and handle widths - resource.handle_width = 6; - if (XrmGetResource(resource.stylerc, "handleWidth", "HandleWidth", - &value_type, &value) && - sscanf(value.addr, "%u", &uint_value) == 1 && - uint_value <= (getWidth() / 2) && uint_value != 0) { - resource.handle_width = uint_value; - } + if (! style.getValue("handleWidth", resource.handle_width) || + resource.handle_width > (getWidth() / 2) || resource.handle_width == 0) + resource.handle_width = 6; - resource.border_width = 1; - if (XrmGetResource(resource.stylerc, "borderWidth", "BorderWidth", - &value_type, &value) && - sscanf(value.addr, "%u", &uint_value) == 1) { - resource.border_width = uint_value; - } + if (! style.getValue("borderWidth", resource.border_width)) + resource.border_width = 1; - resource.bevel_width = 3; - if (XrmGetResource(resource.stylerc, "bevelWidth", "BevelWidth", - &value_type, &value) && - sscanf(value.addr, "%u", &uint_value) == 1 && - uint_value <= (getWidth() / 2) && uint_value != 0) { - resource.bevel_width = uint_value; - } + if (! style.getValue("bevelWidth", resource.bevel_width) || + resource.bevel_width > (getWidth() / 2) || resource.bevel_width == 0) + resource.bevel_width = 3; - resource.frame_width = resource.bevel_width; - if (XrmGetResource(resource.stylerc, "frameWidth", "FrameWidth", - &value_type, &value) && - sscanf(value.addr, "%u", &uint_value) == 1 && - uint_value <= (getWidth() / 2)) { - resource.frame_width = uint_value; - } + if (! style.getValue("frameWidth", resource.frame_width) || + resource.frame_width > (getWidth() / 2)) + resource.frame_width = resource.bevel_width; - if (XrmGetResource(resource.stylerc, "rootCommand", "RootCommand", - &value_type, &value)) { - bexec(value.addr, displayString()); - } - - XrmDestroyDatabase(resource.stylerc); + if (style.getValue("rootCommand", s)) + bexec(s, displayString()); } @@ -741,6 +943,8 @@ BlackboxWindow *BScreen::getIcon(unsigned int index) { unsigned int BScreen::addWorkspace(void) { Workspace *wkspc = new Workspace(this, workspacesList.size()); workspacesList.push_back(wkspc); + saveWorkspaces(getWorkspaceCount() + 1); + saveWorkspaceNames(); workspacemenu->insert(wkspc->getName(), wkspc->getMenu(), wkspc->getID() + 2); @@ -771,6 +975,9 @@ unsigned int BScreen::removeLastWorkspace(void) { workspacesList.pop_back(); delete wkspc; + saveWorkspaces(getWorkspaceCount() - 1); + saveWorkspaceNames(); + toolbar->reconfigure(); updateNetizenWorkspaceCount(); @@ -981,13 +1188,6 @@ void BScreen::raiseWindows(Window *workspace_stack, unsigned int num) { } -#ifdef HAVE_STRFTIME -void BScreen::saveStrftimeFormat(const string& format) { - resource.strftime_format = format; -} -#endif // HAVE_STRFTIME - - void BScreen::addWorkspaceName(const string& name) { workspaceNames.push_back(name); } @@ -1060,7 +1260,7 @@ void BScreen::nextFocus(void) { do { current = next; next = current_workspace->getNextWindowInList(current); - } while(!next->setInputFocus() && next != focused); + } while(! next->setInputFocus() && next != focused); if (next != focused) current_workspace->raiseWindow(next); @@ -1089,7 +1289,7 @@ void BScreen::prevFocus(void) { do { current = next; next = current_workspace->getPrevWindowInList(current); - } while(!next->setInputFocus() && next != focused); + } while(! next->setInputFocus() && next != focused); if (next != focused) current_workspace->raiseWindow(next); @@ -1130,11 +1330,11 @@ void BScreen::InitMenu(void) { const char *menu_filename = blackbox->getMenuFilename(); if (menu_filename) - if (!(menu_file = fopen(menu_filename, "r"))) + if (! (menu_file = fopen(menu_filename, "r"))) perror(menu_filename); - if (!menu_file) { // opening the menu file failed, try the default menu + if (! menu_file) { // opening the menu file failed, try the default menu menu_filename = DEFAULTMENU; - if (!(menu_file = fopen(menu_filename, "r"))) + if (! (menu_file = fopen(menu_filename, "r"))) perror(menu_filename); } @@ -1176,7 +1376,7 @@ void BScreen::InitMenu(void) { rootmenu->setLabel(label); defaultMenu = parseMenuFile(menu_file, rootmenu); - if (!defaultMenu) + if (! defaultMenu) blackbox->addMenuTimestamp(menu_filename); break; } @@ -1746,15 +1946,13 @@ void BScreen::updateFocusModel() BTexture BScreen::readDatabaseTexture(const string &rname, - const string &rclass, - const string &default_color) { + const string &default_color, + Configuration &style) { BTexture texture; - XrmValue value; - char *value_type; + string s; - if (XrmGetResource(resource.stylerc, rname.c_str(), rclass.c_str(), - &value_type, &value)) - texture = BTexture(value.addr); + if (style.getValue(rname, s)) + texture = BTexture(s); else texture.setTexture(BTexture::Solid | BTexture::Flat); @@ -1764,32 +1962,27 @@ BTexture BScreen::readDatabaseTexture(const string &rname, if (texture.texture() & BTexture::Solid) { texture.setColor(readDatabaseColor(rname + ".color", - rclass + ".Color", - default_color)); + default_color, style)); texture.setColorTo(readDatabaseColor(rname + ".colorTo", - rclass + ".ColorTo", - default_color)); + default_color, style)); } else if (texture.texture() & BTexture::Gradient) { texture.setColor(readDatabaseColor(rname + ".color", - rclass + ".Color", - default_color)); + default_color, style)); texture.setColorTo(readDatabaseColor(rname + ".colorTo", - rclass + ".ColorTo", - default_color)); + default_color, style)); } return texture; } -BColor BScreen::readDatabaseColor(const string &rname, const string &rclass, - const string &default_color) { +BColor BScreen::readDatabaseColor(const string &rname, + const string &default_color, + Configuration &style) { BColor color; - XrmValue value; - char *value_type; - if (XrmGetResource(resource.stylerc, rname.c_str(), rclass.c_str(), - &value_type, &value)) - color = BColor(value.addr, getBaseDisplay(), getScreenNumber()); + string s; + if (style.getValue(rname, s)) + color = BColor(s, getBaseDisplay(), getScreenNumber()); else color = BColor(default_color, getBaseDisplay(), getScreenNumber()); return color; @@ -1797,18 +1990,14 @@ BColor BScreen::readDatabaseColor(const string &rname, const string &rclass, XFontSet BScreen::readDatabaseFontSet(const string &rname, - const string &rclass) { + Configuration &style) { char *defaultFont = "fixed"; bool load_default = True; - XrmValue value; - char *value_type; + string s; XFontSet fontset = 0; - if (XrmGetResource(resource.stylerc, rname.c_str(), rclass.c_str(), - &value_type, &value) && - (fontset = createFontSet(value.addr))) { + if (style.getValue(rname, s) && (fontset = createFontSet(s))) load_default = False; - } if (load_default) { fontset = createFontSet(defaultFont); @@ -1826,20 +2015,18 @@ XFontSet BScreen::readDatabaseFontSet(const string &rname, XFontStruct *BScreen::readDatabaseFont(const string &rname, - const string &rclass) { + Configuration &style) { char *defaultFont = "fixed"; bool load_default = False; - XrmValue value; - char *value_type; + string s; XFontStruct *font = 0; - if (XrmGetResource(resource.stylerc, rname.c_str(), rclass.c_str(), - &value_type, &value)) { - if ((font = XLoadQueryFont(blackbox->getXDisplay(), value.addr)) == NULL) { + if (style.getValue(rname, s)) { + if ((font = XLoadQueryFont(blackbox->getXDisplay(), s.c_str())) == NULL) { fprintf(stderr, i18n(ScreenSet, ScreenFontLoadFail, "BScreen::setCurrentStyle(): couldn't load font '%s'\n"), - value.addr); + s.c_str()); load_default = True; } @@ -1866,7 +2053,7 @@ static const char * strcasestr(const char *str, const char *ptn) { const char *s2, *p2; for(; *str; str++) { for(s2=str,p2=ptn; ; s2++,p2++) { - if (!*p2) return str; + if (! *p2) return str; if (toupper(*s2) != toupper(*p2)) break; } } @@ -1906,7 +2093,7 @@ static const char *getFontSize(const char *pattern, int *size) { int n=0; for (p=pattern; 1; p++) { - if (!*p) { + if (! *p) { if (p2!=NULL && n>1 && n<72) { *size = n; return p2+1; } else { diff --git a/src/Screen.hh b/src/Screen.hh index 7a75ac62..cb28dea0 100644 --- a/src/Screen.hh +++ b/src/Screen.hh @@ -45,6 +45,7 @@ extern "C" { #include "Color.hh" #include "Texture.hh" +#include "Image.hh" #include "Configmenu.hh" #include "Iconmenu.hh" #include "Netizen.hh" @@ -117,6 +118,7 @@ private: Configmenu *configmenu; Iconmenu *iconmenu; Rootmenu *rootmenu; + Configuration *config; typedef std::list RootmenuList; RootmenuList rootmenuList; @@ -147,19 +149,14 @@ private: ToolbarStyle tstyle; MenuStyle mstyle; - bool toolbar_on_top, toolbar_auto_hide, sloppy_focus, auto_raise, - auto_edge_balance, image_dither, ordered_dither, opaque_move, full_max, - focus_new, focus_last, click_raise; + bool sloppy_focus, auto_raise, auto_edge_balance, ordered_dither, + opaque_move, full_max, focus_new, focus_last, click_raise; BColor border_color; - XrmDatabase stylerc; unsigned int workspaces; int toolbar_placement, toolbar_width_percent, placement_policy, edge_snap_threshold, row_direction, col_direction; - bool slit_on_top, slit_auto_hide; - int slit_placement, slit_direction; - unsigned int handle_width, bevel_width, frame_width, border_width; #ifdef HAVE_STRFTIME @@ -170,6 +167,7 @@ private: #endif // HAVE_STRFTIME } resource; + std::string screenstr; BScreen(const BScreen&); BScreen& operator=(const BScreen&); @@ -177,15 +175,13 @@ private: bool parseMenuFile(FILE *file, Rootmenu *menu); BTexture readDatabaseTexture(const std::string &rname, - const std::string &rclass, - const std::string &default_color); + const std::string &default_color, + Configuration &style); BColor readDatabaseColor(const std::string &rname, - const std::string &rclass, - const std::string &default_color); - XFontSet readDatabaseFontSet(const std::string &rname, - const std::string &rclass); - XFontStruct *readDatabaseFont(const std::string &rname, - const std::string &rclass); + const std::string &default_color, + Configuration &style); + XFontSet readDatabaseFontSet(const std::string &rname, Configuration &style); + XFontStruct *readDatabaseFont(const std::string &rname, Configuration &style); XFontSet createFontSet(const std::string &fontname); void InitMenu(void); @@ -204,21 +200,14 @@ public: BScreen(Blackbox *bb, unsigned int scrn); ~BScreen(void); - inline bool isToolbarOnTop(void) const - { return resource.toolbar_on_top; } - inline bool doToolbarAutoHide(void) const - { return resource.toolbar_auto_hide; } - inline bool isSloppyFocus(void) const - { return resource.sloppy_focus; } + inline bool isSloppyFocus(void) const { return resource.sloppy_focus; } inline bool isRootColormapInstalled(void) const { return root_colormap_installed; } inline bool doAutoRaise(void) const { return resource.auto_raise; } inline bool doClickRaise(void) const { return resource.click_raise; } inline bool isScreenManaged(void) const { return managed; } - inline bool doImageDither(void) const - { return resource.image_dither; } - inline bool doOrderedDither(void) const - { return resource.ordered_dither; } + inline bool doImageDither(void) const { return image_control->doDither(); } + inline bool doOrderedDither(void) const { return resource.ordered_dither; } inline bool doOpaqueMove(void) const { return resource.opaque_move; } inline bool doFullMax(void) const { return resource.full_max; } inline bool doFocusNew(void) const { return resource.focus_new; } @@ -231,19 +220,7 @@ public: inline BImageControl *getImageControl(void) { return image_control; } inline Rootmenu *getRootmenu(void) { return rootmenu; } - inline bool isSlitOnTop(void) const { return resource.slit_on_top; } - inline bool doSlitAutoHide(void) const - { return resource.slit_auto_hide; } inline Slit *getSlit(void) { return slit; } - inline int getSlitPlacement(void) const - { return resource.slit_placement; } - inline int getSlitDirection(void) const - { return resource.slit_direction; } - inline void saveSlitPlacement(int p) { resource.slit_placement = p; } - inline void saveSlitDirection(int d) { resource.slit_direction = d; } - inline void saveSlitOnTop(bool t) { resource.slit_on_top = t; } - inline void saveSlitAutoHide(bool t) { resource.slit_auto_hide = t; } - inline Toolbar *getToolbar(void) { return toolbar; } Workspace *getWorkspace(unsigned int index); @@ -268,10 +245,6 @@ public: inline unsigned int getIconCount(void) { return iconList.size(); } inline unsigned int getNumberOfWorkspaces(void) const { return resource.workspaces; } - inline int getToolbarPlacement(void) const - { return resource.toolbar_placement; } - inline int getToolbarWidthPercent(void) const - { return resource.toolbar_width_percent; } inline int getPlacementPolicy(void) const { return resource.placement_policy; } inline int getEdgeSnapThreshold(void) const @@ -282,25 +255,19 @@ public: { return resource.col_direction; } inline void setRootColormapInstalled(bool r) { root_colormap_installed = r; } - inline void saveSloppyFocus(bool s) { resource.sloppy_focus = s; } - inline void saveAutoRaise(bool a) { resource.auto_raise = a; } - inline void saveClickRaise(bool c) { resource.click_raise = c; } - inline void saveWorkspaces(unsigned int w) { resource.workspaces = w; } - inline void saveToolbarOnTop(bool r) { resource.toolbar_on_top = r; } - inline void saveToolbarAutoHide(bool r) { resource.toolbar_auto_hide = r; } - inline void saveToolbarWidthPercent(int w) - { resource.toolbar_width_percent = w; } - inline void saveToolbarPlacement(int p) { resource.toolbar_placement = p; } - inline void savePlacementPolicy(int p) { resource.placement_policy = p; } - inline void saveRowPlacementDirection(int d) { resource.row_direction = d; } - inline void saveColPlacementDirection(int d) { resource.col_direction = d; } - inline void saveEdgeSnapThreshold(int t) - { resource.edge_snap_threshold = t; } - inline void saveImageDither(bool d) { resource.image_dither = d; } - inline void saveOpaqueMove(bool o) { resource.opaque_move = o; } - inline void saveFullMax(bool f) { resource.full_max = f; } - inline void saveFocusNew(bool f) { resource.focus_new = f; } - inline void saveFocusLast(bool f) { resource.focus_last = f; } + void saveSloppyFocus(bool s); + void saveAutoRaise(bool a); + void saveClickRaise(bool c); + void saveWorkspaces(unsigned int w); + void savePlacementPolicy(int p); + void saveRowPlacementDirection(int d); + void saveColPlacementDirection(int d); + void saveEdgeSnapThreshold(int t); + void saveImageDither(bool d); + void saveOpaqueMove(bool o); + void saveFullMax(bool f); + void saveFocusNew(bool f); + void saveFocusLast(bool f); inline void iconUpdate(void) { iconmenu->update(); } #ifdef HAVE_STRFTIME @@ -309,9 +276,9 @@ public: void saveStrftimeFormat(const std::string& format); #else // !HAVE_STRFTIME inline int getDateFormat(void) { return resource.date_format; } - inline void saveDateFormat(int f) { resource.date_format = f; } + inline void saveDateFormat(int f); inline bool isClock24Hour(void) { return resource.clock24hour; } - inline void saveClock24Hour(bool c) { resource.clock24hour = c; } + inline void saveClock24Hour(bool c); #endif // HAVE_STRFTIME inline WindowStyle *getWindowStyle(void) { return &resource.wstyle; } @@ -331,6 +298,7 @@ public: void addWorkspaceName(const std::string& name); const std::string getNameOfWorkspace(unsigned int id); void changeWorkspaceID(unsigned int id); + void saveWorkspaceNames(void); void addNetizen(Netizen *n); void removeNetizen(Window w); @@ -347,6 +315,8 @@ public: void prevFocus(void); void nextFocus(void); void raiseFocus(void); + void load_rc(void); + void save_rc(void); void reconfigure(void); void toggleFocusModel(FocusModel model); void updateFocusModel(void); diff --git a/src/Slit.cc b/src/Slit.cc index 08767400..83923dfc 100644 --- a/src/Slit.cc +++ b/src/Slit.cc @@ -40,9 +40,11 @@ extern "C" { Slit::Slit(BScreen *scr) { screen = scr; blackbox = screen->getBlackbox(); + slitstr = (std::string)"session.screen" + itostring(screen->getScreenNumber()) + + ".slit."; + config = blackbox->getConfig(); - on_top = screen->isSlitOnTop(); - hidden = do_auto_hide = screen->doSlitAutoHide(); + load_rc(); display = screen->getBaseDisplay()->getXDisplay(); frame.window = frame.pixmap = None; @@ -197,6 +199,82 @@ void Slit::removeClient(Window w, bool remap) { } +void Slit::saveOnTop(bool b) { + on_top = b; + config->setValue(slitstr + "onTop", on_top); +} + +void Slit::saveAutoHide(bool b) { + do_auto_hide = b; + config->setValue(slitstr + "autoHide", do_auto_hide); +} + +void Slit::savePlacement(int p) { + placement = p; + const char *pname; + switch (placement) { + case TopLeft: pname = "TopLeft"; break; + case CenterLeft: pname = "CenterLeft"; break; + case BottomLeft: pname = "BottomLeft"; break; + case TopCenter: pname = "TopCenter"; break; + case BottomCenter: pname = "BottomCenter"; break; + case TopRight: pname = "TopRight"; break; + case BottomRight: pname = "BottomRight"; break; + case CenterRight: default: pname = "CenterRight"; break; + } + config->setValue(slitstr + "placement", pname); +} + +void Slit::saveDirection(int d) { + direction = d; + config->setValue(slitstr + "direction", (direction == Horizontal ? + "Horizontal" : "Vertical")); +} + +void Slit::save_rc(void) { + saveOnTop(on_top); + saveAutoHide(do_auto_hide); + savePlacement(placement); + saveDirection(direction); +} + +void Slit::load_rc(void) { + std::string s; + + if (! config->getValue(slitstr + "onTop", on_top)) + on_top = false; + + if (! config->getValue(slitstr + "autoHide", do_auto_hide)) + do_auto_hide = false; + hidden = do_auto_hide; + + if (config->getValue(slitstr + "direction", s) && s == "Horizontal") + direction = Horizontal; + else + direction = Vertical; + + if (config->getValue(slitstr + "placement", s)) { + if (s == "TopLeft") + placement = TopLeft; + else if (s == "CenterLeft") + placement = CenterLeft; + else if (s == "BottomLeft") + placement = BottomLeft; + else if (s == "TopCenter") + placement = TopCenter; + else if (s == "BottomCenter") + placement = BottomCenter; + else if (s == "TopRight") + placement = TopRight; + else if (s == "BottomRight") + placement = BottomRight; + else //if (s == "CenterRight") + placement = CenterRight; + } else + placement = CenterRight; +} + + void Slit::reconfigure(void) { SlitClientList::iterator it = clientList.begin(); const SlitClientList::iterator end = clientList.end(); @@ -204,7 +282,7 @@ void Slit::reconfigure(void) { unsigned int width = 0, height = 0; - switch (screen->getSlitDirection()) { + switch (direction) { case Vertical: for (; it != end; ++it) { client = *it; @@ -274,7 +352,7 @@ void Slit::reconfigure(void) { int x, y; - switch (screen->getSlitDirection()) { + switch (direction) { case Vertical: x = 0; y = screen->getBevelWidth(); @@ -355,9 +433,9 @@ void Slit::updateStrut(void) { strut.top = strut.bottom = strut.left = strut.right = 0; if (! clientList.empty()) { - switch (screen->getSlitDirection()) { + switch (direction) { case Vertical: - switch (screen->getSlitPlacement()) { + switch (placement) { case TopCenter: strut.top = getY() + getExposedHeight() + (screen->getBorderWidth() * 2); @@ -378,7 +456,7 @@ void Slit::updateStrut(void) { } break; case Horizontal: - switch (screen->getSlitPlacement()) { + switch (placement) { case TopCenter: case TopLeft: case TopRight: @@ -408,11 +486,11 @@ void Slit::updateStrut(void) { void Slit::reposition(void) { // place the slit in the appropriate place - switch (screen->getSlitPlacement()) { + switch (placement) { case TopLeft: frame.rect.setPos(0, 0); - if (screen->getSlitDirection() == Vertical) { + if (direction == Vertical) { frame.x_hidden = screen->getBevelWidth() - screen->getBorderWidth() - frame.rect.width(); frame.y_hidden = 0; @@ -435,7 +513,7 @@ void Slit::reposition(void) { frame.rect.setPos(0, (screen->getHeight() - frame.rect.height() - (screen->getBorderWidth() * 2))); - if (screen->getSlitDirection() == Vertical) { + if (direction == Vertical) { frame.x_hidden = screen->getBevelWidth() - screen->getBorderWidth() - frame.rect.width(); frame.y_hidden = frame.rect.y(); @@ -467,7 +545,7 @@ void Slit::reposition(void) { frame.rect.setPos((screen->getWidth() - frame.rect.width() - (screen->getBorderWidth() * 2)), 0); - if (screen->getSlitDirection() == Vertical) { + if (direction == Vertical) { frame.x_hidden = screen->getWidth() - screen->getBevelWidth() - screen->getBorderWidth(); frame.y_hidden = 0; @@ -495,7 +573,7 @@ void Slit::reposition(void) { (screen->getHeight() - frame.rect.height() - (screen->getBorderWidth() * 2))); - if (screen->getSlitDirection() == Vertical) { + if (direction == Vertical) { frame.x_hidden = screen->getWidth() - screen->getBevelWidth() - screen->getBorderWidth(); frame.y_hidden = frame.rect.y(); @@ -523,7 +601,7 @@ void Slit::reposition(void) { delta = -delta; } frame.rect.setY(frame.rect.y() + delta); - if (screen->getSlitDirection() == Vertical) + if (direction == Vertical) frame.y_hidden += delta; } @@ -644,7 +722,7 @@ void Slit::timeout(void) { void Slit::toggleAutoHide(void) { - do_auto_hide = (do_auto_hide) ? False : True; + saveAutoHide(do_auto_hide ? False : True); updateStrut(); @@ -699,8 +777,8 @@ void Slitmenu::itemSelected(int button, unsigned int index) { switch (item->function()) { case 1: { // always on top - slit->on_top = ((slit->isOnTop()) ? False : True); - setItemSelected(2, slit->on_top); + slit->saveOnTop(! slit->isOnTop()); + setItemSelected(2, slit->isOnTop()); if (slit->isOnTop()) slit->screen->raiseWindows((Window *) 0, 0); break; @@ -708,7 +786,7 @@ void Slitmenu::itemSelected(int button, unsigned int index) { case 2: { // auto hide slit->toggleAutoHide(); - setItemSelected(3, slit->do_auto_hide); + setItemSelected(3, slit->doAutoHide()); break; } @@ -732,7 +810,7 @@ void Slitmenu::reconfigure(void) { Slitmenu::Directionmenu::Directionmenu(Slitmenu *sm) - : Basemenu(sm->slit->screen) { + : Basemenu(sm->slit->screen), slit(sm->slit) { setLabel(i18n(SlitSet, SlitSlitDirection, "Slit Direction")); setInternalMenu(); @@ -743,11 +821,20 @@ Slitmenu::Directionmenu::Directionmenu(Slitmenu *sm) Slit::Vertical); update(); + setValues(); +} - if (getScreen()->getSlitDirection() == Slit::Horizontal) - setItemSelected(0, True); - else - setItemSelected(1, True); + +void Slitmenu::Directionmenu::reconfigure(void) { + setValues(); + Basemenu::reconfigure(); +} + + +void Slitmenu::Directionmenu::setValues(void) { + const bool horiz = slit->getDirection() == Slit::Horizontal; + setItemSelected(0, horiz); + setItemSelected(1, ! horiz); } @@ -758,23 +845,14 @@ void Slitmenu::Directionmenu::itemSelected(int button, unsigned int index) { BasemenuItem *item = find(index); if (! item) return; - getScreen()->saveSlitDirection(item->function()); - - if (item->function() == Slit::Horizontal) { - setItemSelected(0, True); - setItemSelected(1, False); - } else { - setItemSelected(0, False); - setItemSelected(1, True); - } - + slit->saveDirection(item->function()); hide(); - getScreen()->getSlit()->reconfigure(); + slit->reconfigure(); } Slitmenu::Placementmenu::Placementmenu(Slitmenu *sm) - : Basemenu(sm->slit->screen) { + : Basemenu(sm->slit->screen), slit(sm->slit) { setLabel(i18n(SlitSet, SlitSlitPlacement, "Slit Placement")); setMinimumSublevels(3); @@ -799,6 +877,45 @@ Slitmenu::Placementmenu::Placementmenu(Slitmenu *sm) Slit::BottomRight); update(); + + setValues(); +} + + +void Slitmenu::Placementmenu::reconfigure(void) { + setValues(); + Basemenu::reconfigure(); +} + + +void Slitmenu::Placementmenu::setValues(void) { + int place = 0; + switch (slit->getPlacement()) { + case Slit::BottomRight: + place++; + case Slit::CenterRight: + place++; + case Slit::TopRight: + place++; + case Slit::BottomCenter: + place++; + case Slit::TopCenter: + place++; + case Slit::BottomLeft: + place++; + case Slit::CenterLeft: + place++; + case Slit::TopLeft: + break; + } + setItemSelected(0, 0 == place); + setItemSelected(1, 1 == place); + setItemSelected(2, 2 == place); + setItemSelected(3, 3 == place); + setItemSelected(5, 4 == place); + setItemSelected(6, 5 == place); + setItemSelected(7, 6 == place); + setItemSelected(8, 7 == place); } @@ -809,8 +926,8 @@ void Slitmenu::Placementmenu::itemSelected(int button, unsigned int index) { BasemenuItem *item = find(index); if (! (item && item->function())) return; - getScreen()->saveSlitPlacement(item->function()); + slit->savePlacement(item->function()); hide(); - getScreen()->getSlit()->reconfigure(); + slit->reconfigure(); } diff --git a/src/Slit.hh b/src/Slit.hh index c0484c2f..85b49d7d 100644 --- a/src/Slit.hh +++ b/src/Slit.hh @@ -30,6 +30,7 @@ extern "C" { } #include +#include #include "Screen.hh" #include "Basemenu.hh" @@ -44,24 +45,30 @@ private: private: Directionmenu(const Directionmenu&); Directionmenu& operator=(const Directionmenu&); + Slit *slit; protected: virtual void itemSelected(int button, unsigned int index); - + virtual void setValues(void); + public: Directionmenu(Slitmenu *sm); + virtual void reconfigure(void); }; class Placementmenu : public Basemenu { private: Placementmenu(const Placementmenu&); Placementmenu& operator=(const Placementmenu&); + Slit *slit; protected: virtual void itemSelected(int buton, unsigned int index); + virtual void setValues(void); public: Placementmenu(Slitmenu *sm); + virtual void reconfigure(void); }; Directionmenu *directionmenu; @@ -103,10 +110,13 @@ private: typedef std::list SlitClientList; bool on_top, hidden, do_auto_hide; + int direction, placement; + std::string slitstr; Display *display; Blackbox *blackbox; BScreen *screen; + Configuration *config; BTimer *timer; Strut strut; @@ -137,6 +147,13 @@ public: inline bool isOnTop(void) const { return on_top; } inline bool isHidden(void) const { return hidden; } inline bool doAutoHide(void) const { return do_auto_hide; } + inline int getPlacement(void) const { return placement; } + inline int getDirection(void) const { return direction; } + + void saveOnTop(bool); + void saveAutoHide(bool); + void savePlacement(int); + void saveDirection(int); inline Slitmenu *getMenu(void) { return slitmenu; } @@ -149,13 +166,13 @@ public: inline unsigned int getWidth(void) const { return frame.rect.width(); } inline unsigned int getExposedWidth(void) const { - if (screen->getSlitDirection() == Vertical && do_auto_hide) + if (direction == Vertical && do_auto_hide) return screen->getBevelWidth(); return frame.rect.width(); } inline unsigned int getHeight(void) const { return frame.rect.height(); } inline unsigned int getExposedHeight(void) const { - if (screen->getSlitDirection() == Horizontal && do_auto_hide) + if (direction == Horizontal && do_auto_hide) return screen->getBevelWidth(); return frame.rect.height(); } @@ -163,6 +180,8 @@ public: void addClient(Window w); void removeClient(SlitClient *client, bool remap = True); void removeClient(Window w, bool remap = True); + void load_rc(void); + void save_rc(void); void reconfigure(void); void updateSlit(void); void reposition(void); diff --git a/src/Timer.cc b/src/Timer.cc index 443a7c46..99f05ba9 100644 --- a/src/Timer.cc +++ b/src/Timer.cc @@ -106,6 +106,6 @@ timeval BTimer::endpoint(void) const { bool BTimer::shouldFire(const timeval &tm) const { timeval end = endpoint(); - return !((tm.tv_sec < end.tv_sec) || - (tm.tv_sec == end.tv_sec && tm.tv_usec < end.tv_usec)); + return ! ((tm.tv_sec < end.tv_sec) || + (tm.tv_sec == end.tv_sec && tm.tv_usec < end.tv_usec)); } diff --git a/src/Toolbar.cc b/src/Toolbar.cc index a51f949c..5ff333ad 100644 --- a/src/Toolbar.cc +++ b/src/Toolbar.cc @@ -76,6 +76,11 @@ static long aMinuteFromNow(void) { Toolbar::Toolbar(BScreen *scrn) { screen = scrn; blackbox = screen->getBlackbox(); + toolbarstr = (string)"session.screen" + itostring(screen->getScreenNumber()) + + ".toolbar."; + config = blackbox->getConfig(); + + load_rc(); // get the clock updating every minute clock_timer = new BTimer(blackbox, this); @@ -88,9 +93,6 @@ Toolbar::Toolbar(BScreen *scrn) { hide_timer = new BTimer(blackbox, &hide_handler); hide_timer->setTimeout(blackbox->getAutoRaiseDelay()); - on_top = screen->isToolbarOnTop(); - hidden = do_auto_hide = screen->doToolbarAutoHide(); - editing = False; new_name_pos = 0; frame.grab_x = frame.grab_y = 0; @@ -196,9 +198,82 @@ Toolbar::~Toolbar(void) { } +void Toolbar::saveOnTop(bool b) { + on_top = b; + config->setValue(toolbarstr + "onTop", on_top); +} + + +void Toolbar::saveAutoHide(bool b) { + do_auto_hide = b; + config->setValue(toolbarstr + "autoHide", do_auto_hide); +} + + +void Toolbar::saveWidthPercent(unsigned int w) { + width_percent = w; + config->setValue(toolbarstr + "widthPercent", width_percent); +} + + +void Toolbar::savePlacement(int p) { + placement = p; + const char *pname; + switch (placement) { + case TopLeft: pname = "TopLeft"; break; + case BottomLeft: pname = "BottomLeft"; break; + case TopCenter: pname = "TopCenter"; break; + case TopRight: pname = "TopRight"; break; + case BottomRight: pname = "BottomRight"; break; + case BottomCenter: default: pname = "BottomCenter"; break; + } + config->setValue(toolbarstr + "placement", pname); +} + + +void Toolbar::save_rc(void) { + saveOnTop(on_top); + saveAutoHide(do_auto_hide); + saveWidthPercent(width_percent); + savePlacement(placement); +} + + +void Toolbar::load_rc(void) { + string s; + + if (! config->getValue(toolbarstr + "onTop", on_top)) + on_top = false; + + if (! config->getValue(toolbarstr + "autoHide", do_auto_hide)) + do_auto_hide = false; + hidden = do_auto_hide; + + if (! config->getValue(toolbarstr + "widthPercent", width_percent) || + width_percent == 0 || width_percent > 100) + width_percent = 66; + + if (config->getValue(toolbarstr + "placement", s)) { + if (s == "TopLeft") + placement = TopLeft; + else if (s == "BottomLeft") + placement = BottomLeft; + else if (s == "TopCenter") + placement = TopCenter; + else if (s == "TopRight") + placement = TopRight; + else if (s == "BottomRight") + placement = BottomRight; + else //if (s == "BottomCenter") + placement = BottomCenter; + } else + placement = BottomCenter; +} + + void Toolbar::reconfigure(void) { unsigned int height = 0, - width = (screen->getWidth() * screen->getToolbarWidthPercent()) / 100; + width = (screen->getWidth() * width_percent) / 100; if (i18n.multibyte()) height = screen->getToolbarStyle()->fontset_extents->max_ink_extent.height; @@ -215,13 +290,13 @@ void Toolbar::reconfigure(void) { frame.rect.setSize(width, height); int x, y; - switch (screen->getToolbarPlacement()) { + switch (placement) { case TopLeft: case TopRight: case TopCenter: - if (screen->getToolbarPlacement() == TopLeft) + if (placement == TopLeft) x = 0; - else if (screen->getToolbarPlacement() == TopRight) + else if (placement == TopRight) x = screen->getWidth() - frame.rect.width() - (screen->getBorderWidth() * 2); else @@ -238,9 +313,9 @@ void Toolbar::reconfigure(void) { case BottomRight: case BottomCenter: default: - if (screen->getToolbarPlacement() == BottomLeft) + if (placement == BottomLeft) x = 0; - else if (screen->getToolbarPlacement() == BottomRight) + else if (placement == BottomRight) x = screen->getWidth() - frame.rect.width() - (screen->getBorderWidth() * 2); else @@ -436,7 +511,7 @@ void Toolbar::updateStrut(void) { // left and right are always 0 strut.top = strut.bottom = 0; - switch(screen->getToolbarPlacement()) { + switch(placement) { case TopLeft: case TopCenter: case TopRight: @@ -973,7 +1048,7 @@ void Toolbar::HideHandler::timeout(void) { void Toolbar::toggleAutoHide(void) { - do_auto_hide = (do_auto_hide) ? False : True; + saveAutoHide(! doAutoHide()); updateStrut(); screen->getSlit()->reposition(); @@ -1002,9 +1077,13 @@ Toolbarmenu::Toolbarmenu(Toolbar *tb) : Basemenu(tb->screen) { "Edit current workspace name"), 3); update(); + setValues(); +} - if (toolbar->isOnTop()) setItemSelected(1, True); - if (toolbar->doAutoHide()) setItemSelected(2, True); + +void Toolbarmenu::setValues() { + setItemSelected(1, toolbar->isOnTop()); + setItemSelected(2, toolbar->doAutoHide()); } @@ -1022,8 +1101,8 @@ void Toolbarmenu::itemSelected(int button, unsigned int index) { switch (item->function()) { case 1: { // always on top - toolbar->on_top = ((toolbar->isOnTop()) ? False : True);; - setItemSelected(1, toolbar->on_top); + toolbar->saveOnTop(! toolbar->isOnTop()); + setItemSelected(1, toolbar->isOnTop()); if (toolbar->isOnTop()) getScreen()->raiseWindows((Window *) 0, 0); break; @@ -1031,7 +1110,7 @@ void Toolbarmenu::itemSelected(int button, unsigned int index) { case 2: { // auto hide toolbar->toggleAutoHide(); - setItemSelected(2, toolbar->do_auto_hide); + setItemSelected(2, toolbar->doAutoHide()); break; } @@ -1054,6 +1133,7 @@ void Toolbarmenu::internal_hide(void) { void Toolbarmenu::reconfigure(void) { + setValues(); placementmenu->reconfigure(); Basemenu::reconfigure(); @@ -1061,7 +1141,7 @@ void Toolbarmenu::reconfigure(void) { Toolbarmenu::Placementmenu::Placementmenu(Toolbarmenu *tm) - : Basemenu(tm->toolbar->screen) { + : Basemenu(tm->toolbar->screen), toolbar(tm->toolbar) { setLabel(i18n(ToolbarSet, ToolbarToolbarPlacement, "Toolbar Placement")); setInternalMenu(); setMinimumSublevels(3); @@ -1079,6 +1159,38 @@ Toolbarmenu::Placementmenu::Placementmenu(Toolbarmenu *tm) insert(i18n(CommonSet, CommonPlacementBottomRight, "Bottom Right"), Toolbar::BottomRight); update(); + setValues(); +} + + +void Toolbarmenu::Placementmenu::setValues(void) { + int place = 0; + switch (toolbar->getPlacement()) { + case Toolbar::BottomRight: + place++; + case Toolbar::TopRight: + place++; + case Toolbar::BottomCenter: + place++; + case Toolbar::TopCenter: + place++; + case Toolbar::BottomLeft: + place++; + case Toolbar::TopLeft: + break; + } + setItemSelected(0, 0 == place); + setItemSelected(1, 1 == place); + setItemSelected(2, 2 == place); + setItemSelected(3, 3 == place); + setItemSelected(4, 4 == place); + setItemSelected(5, 5 == place); +} + + +void Toolbarmenu::Placementmenu::reconfigure(void) { + setValues(); + Basemenu::reconfigure(); } @@ -1089,9 +1201,9 @@ void Toolbarmenu::Placementmenu::itemSelected(int button, unsigned int index) { BasemenuItem *item = find(index); if (! item) return; - getScreen()->saveToolbarPlacement(item->function()); + toolbar->savePlacement(item->function()); hide(); - getScreen()->getToolbar()->reconfigure(); + toolbar->reconfigure(); // reposition the slit as well to make sure it doesn't intersect the // toolbar diff --git a/src/Toolbar.hh b/src/Toolbar.hh index 5ec3029c..31b35e7d 100644 --- a/src/Toolbar.hh +++ b/src/Toolbar.hh @@ -41,12 +41,15 @@ private: private: Placementmenu(const Placementmenu&); Placementmenu& operator=(const Placementmenu&); + Toolbar *toolbar; protected: virtual void itemSelected(int button, unsigned int index); + virtual void setValues(void); public: Placementmenu(Toolbarmenu *tm); + virtual void reconfigure(void); }; Toolbar *toolbar; @@ -61,6 +64,7 @@ private: protected: virtual void itemSelected(int button, unsigned int index); virtual void internal_hide(void); + virtual void setValues(void); public: Toolbarmenu(Toolbar *tb); @@ -68,13 +72,16 @@ public: inline Basemenu *getPlacementmenu(void) { return placementmenu; } - void reconfigure(void); + virtual void reconfigure(void); }; class Toolbar : public TimeoutHandler { private: bool on_top, editing, hidden, do_auto_hide; + unsigned int width_percent; + int placement; + std::string toolbarstr; Display *display; struct ToolbarFrame { @@ -99,6 +106,7 @@ private: Blackbox *blackbox; BScreen *screen; + Configuration *config; BTimer *clock_timer, *hide_timer; Toolbarmenu *toolbarmenu; Strut strut; @@ -136,6 +144,16 @@ public: inline bool isOnTop(void) const { return on_top; } inline bool isHidden(void) const { return hidden; } inline bool doAutoHide(void) const { return do_auto_hide; } + inline unsigned int getWidthPercent(void) const { return width_percent; } + inline int getPlacement(void) const { return placement; } + + void saveOnTop(bool); + void saveAutoHide(bool); + void saveWidthPercent(unsigned int); + void savePlacement(int); + + void save_rc(void); + void load_rc(void); inline Window getWindowID(void) const { return frame.window; } diff --git a/src/Util.cc b/src/Util.cc index 0300e52b..a97ffe50 100644 --- a/src/Util.cc +++ b/src/Util.cc @@ -220,3 +220,24 @@ timeval normalizeTimeval(const timeval &tm) { return ret; } + + +string itostring(unsigned long i) { + if (i == 0) + return string("0"); + + string tmp; + for (; i > 0; i /= 10) + tmp.insert(tmp.begin(), "0123456789"[i%10]); + return tmp; +} + + +string itostring(long i) { + if (i < 0) { + std::string tmp = itostring( (unsigned long) -i); + tmp.insert(tmp.begin(), '-'); + return tmp; + } else + return itostring( (unsigned long) i); +} diff --git a/src/Util.hh b/src/Util.hh index 1536226c..2a40308d 100644 --- a/src/Util.hh +++ b/src/Util.hh @@ -99,4 +99,13 @@ struct PointerAssassin { } }; +std::string itostring(unsigned long i); +std::string itostring(long i); +inline std::string itostring(unsigned int i) { + return itostring((unsigned long) i); +} +inline std::string itostring(int i) { + return itostring((long) i); +} + #endif diff --git a/src/Window.cc b/src/Window.cc index 2bc7265d..b9bd0568 100644 --- a/src/Window.cc +++ b/src/Window.cc @@ -1119,8 +1119,8 @@ void BlackboxWindow::getTransientInfo(void) { client.transient_for = 0; Window trans_for; - if (!XGetTransientForHint(blackbox->getXDisplay(), client.window, - &trans_for)) { + if (! XGetTransientForHint(blackbox->getXDisplay(), client.window, + &trans_for)) { // transient_for hint not set return; } @@ -1447,7 +1447,7 @@ void BlackboxWindow::maximize(unsigned int button) { flags currently set. Otherwise it still thinks it is maximized. so we do not need to call configure() because resizing will handle it */ - if (!flags.resizing) + if (! flags.resizing) configure(blackbox_attrib.premax_x, blackbox_attrib.premax_y, blackbox_attrib.premax_w, blackbox_attrib.premax_h); @@ -1770,7 +1770,7 @@ void BlackboxWindow::restoreAttributes(void) { blackbox->getBlackboxAttributesAtom(), &atom_return, &foo, &nitems, &ulfoo, (unsigned char **) &net); - if (ret != Success || !net || nitems != PropBlackboxAttributesElements) + if (ret != Success || ! net || nitems != PropBlackboxAttributesElements) return; if (net->flags & AttribShaded && @@ -2435,7 +2435,7 @@ void BlackboxWindow::buttonReleaseEvent(XButtonEvent *re) { void BlackboxWindow::motionNotifyEvent(XMotionEvent *me) { - if (!flags.resizing && (me->state & Button1Mask) && + if (! flags.resizing && (me->state & Button1Mask) && (functions & Func_Move) && (frame.title == me->window || frame.label == me->window || frame.handle == me->window || frame.window == me->window)) { @@ -2757,7 +2757,7 @@ void BlackboxWindow::upsize(void) { if (decorations & Decor_Border) { frame.border_w = screen->getBorderWidth(); - if (!isTransient()) + if (! isTransient()) frame.mwm_border_w = screen->getFrameWidth(); else frame.mwm_border_w = 0; diff --git a/src/blackbox.cc b/src/blackbox.cc index bca48e5d..63a5055b 100644 --- a/src/blackbox.cc +++ b/src/blackbox.cc @@ -28,7 +28,6 @@ extern "C" { #include #include -#include #include #include #include @@ -146,6 +145,7 @@ Blackbox::Blackbox(char **m_argv, char *dpy_name, char *rc, char *menu) argv = m_argv; if (! rc) rc = "~/.openbox/rc"; rc_file = expandTilde(rc); + config.setFile(rc_file); if (! menu) menu = "~/.openbox/menu"; menu_file = expandTilde(menu); @@ -184,6 +184,9 @@ Blackbox::Blackbox(char **m_argv, char *dpy_name, char *rc, char *menu) ::exit(3); } + // save current settings and default values + save_rc(); + // set the screen with mouse to the first managed screen active_screen = screenList.front(); setFocusedWindow(0); @@ -716,11 +719,8 @@ void Blackbox::process_event(XEvent *e) { bool Blackbox::handleSignal(int sig) { switch (sig) { case SIGHUP: - reconfigure(); - break; - case SIGUSR1: - reload_rc(); + reconfigure(); break; case SIGUSR2: @@ -969,546 +969,69 @@ void Blackbox::shutdown(void) { std::mem_fun(&BScreen::shutdown)); XSync(getXDisplay(), False); - - save_rc(); } +/* + * Save all values as they are so that the defaults will be written to the rc + * file + */ void Blackbox::save_rc(void) { - XrmDatabase new_blackboxrc = (XrmDatabase) 0; - char rc_string[1024]; - - load_rc(); - - sprintf(rc_string, "session.colorsPerChannel: %d", - resource.colors_per_channel); - XrmPutLineResource(&new_blackboxrc, rc_string); - - sprintf(rc_string, "session.doubleClickInterval: %lu", - resource.double_click_interval); - XrmPutLineResource(&new_blackboxrc, rc_string); - - sprintf(rc_string, "session.autoRaiseDelay: %lu", - ((resource.auto_raise_delay.tv_sec * 1000) + - (resource.auto_raise_delay.tv_usec / 1000))); - XrmPutLineResource(&new_blackboxrc, rc_string); - - sprintf(rc_string, "session.cacheLife: %lu", resource.cache_life / 60000); - XrmPutLineResource(&new_blackboxrc, rc_string); - - sprintf(rc_string, "session.cacheMax: %lu", resource.cache_max); - XrmPutLineResource(&new_blackboxrc, rc_string); - - ScreenList::iterator it = screenList.begin(); - for (; it != screenList.end(); ++it) { - BScreen *screen = *it; - int screen_number = screen->getScreenNumber(); - - char *placement = (char *) 0; - - switch (screen->getSlitPlacement()) { - case Slit::TopLeft: placement = "TopLeft"; break; - case Slit::CenterLeft: placement = "CenterLeft"; break; - case Slit::BottomLeft: placement = "BottomLeft"; break; - case Slit::TopCenter: placement = "TopCenter"; break; - case Slit::BottomCenter: placement = "BottomCenter"; break; - case Slit::TopRight: placement = "TopRight"; break; - case Slit::BottomRight: placement = "BottomRight"; break; - case Slit::CenterRight: default: placement = "CenterRight"; break; - } - - sprintf(rc_string, "session.screen%d.slit.placement: %s", screen_number, - placement); - XrmPutLineResource(&new_blackboxrc, rc_string); - - sprintf(rc_string, "session.screen%d.slit.direction: %s", screen_number, - ((screen->getSlitDirection() == Slit::Horizontal) ? "Horizontal" : - "Vertical")); - XrmPutLineResource(&new_blackboxrc, rc_string); - - sprintf(rc_string, "session.screen%d.slit.onTop: %s", screen_number, - ((screen->getSlit()->isOnTop()) ? "True" : "False")); - XrmPutLineResource(&new_blackboxrc, rc_string); - - sprintf(rc_string, "session.screen%d.slit.autoHide: %s", screen_number, - ((screen->getSlit()->doAutoHide()) ? "True" : "False")); - XrmPutLineResource(&new_blackboxrc, rc_string); - - sprintf(rc_string, "session.opaqueMove: %s", - ((screen->doOpaqueMove()) ? "True" : "False")); - XrmPutLineResource(&new_blackboxrc, rc_string); - - sprintf(rc_string, "session.imageDither: %s", - ((screen->getImageControl()->doDither()) ? "True" : "False")); - XrmPutLineResource(&new_blackboxrc, rc_string); - - sprintf(rc_string, "session.screen%d.fullMaximization: %s", screen_number, - ((screen->doFullMax()) ? "True" : "False")); - XrmPutLineResource(&new_blackboxrc, rc_string); - - sprintf(rc_string, "session.screen%d.focusNewWindows: %s", screen_number, - ((screen->doFocusNew()) ? "True" : "False")); - XrmPutLineResource(&new_blackboxrc, rc_string); - - sprintf(rc_string, "session.screen%d.focusLastWindow: %s", screen_number, - ((screen->doFocusLast()) ? "True" : "False")); - XrmPutLineResource(&new_blackboxrc, rc_string); - - sprintf(rc_string, "session.screen%d.rowPlacementDirection: %s", - screen_number, - ((screen->getRowPlacementDirection() == BScreen::LeftRight) ? - "LeftToRight" : "RightToLeft")); - XrmPutLineResource(&new_blackboxrc, rc_string); - - sprintf(rc_string, "session.screen%d.colPlacementDirection: %s", - screen_number, - ((screen->getColPlacementDirection() == BScreen::TopBottom) ? - "TopToBottom" : "BottomToTop")); - XrmPutLineResource(&new_blackboxrc, rc_string); - - switch (screen->getPlacementPolicy()) { - case BScreen::CascadePlacement: - placement = "CascadePlacement"; - break; - case BScreen::ColSmartPlacement: - placement = "ColSmartPlacement"; - break; - - case BScreen::RowSmartPlacement: - default: - placement = "RowSmartPlacement"; - break; - } - sprintf(rc_string, "session.screen%d.windowPlacement: %s", screen_number, - placement); - XrmPutLineResource(&new_blackboxrc, rc_string); - - string fmodel; - if (screen->isSloppyFocus()) { - fmodel = "SloppyFocus"; - if (screen->doAutoRaise()) fmodel += " AutoRaise"; - if (screen->doClickRaise()) fmodel += " ClickRaise"; - } else { - fmodel = "ClickToFocus"; - } - sprintf(rc_string, "session.screen%d.focusModel: %s", screen_number, - fmodel.c_str()); - XrmPutLineResource(&new_blackboxrc, rc_string); - - sprintf(rc_string, "session.screen%d.workspaces: %d", screen_number, - screen->getWorkspaceCount()); - XrmPutLineResource(&new_blackboxrc, rc_string); - - sprintf(rc_string, "session.screen%d.toolbar.onTop: %s", screen_number, - ((screen->getToolbar()->isOnTop()) ? "True" : "False")); - XrmPutLineResource(&new_blackboxrc, rc_string); - - sprintf(rc_string, "session.screen%d.toolbar.autoHide: %s", - screen_number, - ((screen->getToolbar()->doAutoHide()) ? "True" : "False")); - XrmPutLineResource(&new_blackboxrc, rc_string); - - switch (screen->getToolbarPlacement()) { - case Toolbar::TopLeft: placement = "TopLeft"; break; - case Toolbar::BottomLeft: placement = "BottomLeft"; break; - case Toolbar::TopCenter: placement = "TopCenter"; break; - case Toolbar::TopRight: placement = "TopRight"; break; - case Toolbar::BottomRight: placement = "BottomRight"; break; - case Toolbar::BottomCenter: default: placement = "BottomCenter"; break; - } - - sprintf(rc_string, "session.screen%d.toolbar.placement: %s", - screen_number, placement); - XrmPutLineResource(&new_blackboxrc, rc_string); - - load_rc(screen); - - // these are static, but may not be saved in the users .blackboxrc, - // writing these resources will allow the user to edit them at a later - // time... but loading the defaults before saving allows us to rewrite the - // users changes... - -#ifdef HAVE_STRFTIME - sprintf(rc_string, "session.screen%d.strftimeFormat: %s", screen_number, - screen->getStrftimeFormat()); - XrmPutLineResource(&new_blackboxrc, rc_string); -#else // !HAVE_STRFTIME - sprintf(rc_string, "session.screen%d.dateFormat: %s", screen_number, - ((screen->getDateFormat() == B_EuropeanDate) ? - "European" : "American")); - XrmPutLineResource(&new_blackboxrc, rc_string); - - sprintf(rc_string, "session.screen%d.clockFormat: %d", screen_number, - ((screen->isClock24Hour()) ? 24 : 12)); - XrmPutLineResource(&new_blackboxrc, rc_string); -#endif // HAVE_STRFTIME - - sprintf(rc_string, "session.screen%d.edgeSnapThreshold: %d", - screen_number, screen->getEdgeSnapThreshold()); - XrmPutLineResource(&new_blackboxrc, rc_string); - - sprintf(rc_string, "session.screen%d.toolbar.widthPercent: %d", - screen_number, screen->getToolbarWidthPercent()); - XrmPutLineResource(&new_blackboxrc, rc_string); - - // write out the user's workspace names - - string save_string = screen->getWorkspace(0)->getName(); - for (unsigned int i = 1; i < screen->getWorkspaceCount(); ++i) { - save_string += ','; - save_string += screen->getWorkspace(i)->getName(); - } - - char *resource_string = new char[save_string.length() + 48]; - sprintf(resource_string, "session.screen%d.workspaceNames: %s", - screen_number, save_string.c_str()); - XrmPutLineResource(&new_blackboxrc, resource_string); - - delete [] resource_string; - } - - XrmDatabase old_blackboxrc = XrmGetFileDatabase(rc_file.c_str()); - - XrmMergeDatabases(new_blackboxrc, &old_blackboxrc); - XrmPutFileDatabase(old_blackboxrc, rc_file.c_str()); - XrmDestroyDatabase(old_blackboxrc); + config.setAutoSave(false); + + config.setValue("session.colorsPerChannel", resource.colors_per_channel); + config.setValue("session.doubleClickInterval", + resource.double_click_interval); + config.setValue("session.autoRaiseDelay", + ((resource.auto_raise_delay.tv_sec * 1000) + + (resource.auto_raise_delay.tv_usec / 1000))); + config.setValue("session.cacheLife", resource.cache_life / 60000); + config.setValue("session.cacheMax", resource.cache_max); + config.setValue("session.styleFile", resource.style_file); + + std::for_each(screenList.begin(), screenList.end(), + std::mem_fun(&BScreen::save_rc)); + + config.setAutoSave(true); + config.save(); } void Blackbox::load_rc(void) { - XrmDatabase database = (XrmDatabase) 0; - - database = XrmGetFileDatabase(rc_file.c_str()); - - XrmValue value; - char *value_type; - int int_value; - unsigned long long_value; - - resource.colors_per_channel = 4; - if (XrmGetResource(database, "session.colorsPerChannel", - "Session.ColorsPerChannel", &value_type, &value) && - sscanf(value.addr, "%d", &int_value) == 1) { - resource.colors_per_channel = int_value; - if (resource.colors_per_channel < 2) resource.colors_per_channel = 2; - if (resource.colors_per_channel > 6) resource.colors_per_channel = 6; - } - - if (XrmGetResource(database, "session.styleFile", "Session.StyleFile", - &value_type, &value)) - resource.style_file = expandTilde(value.addr); + if (! config.load()) + config.create(); + + string s; + + if (! config.getValue("session.colorsPerChannel", + resource.colors_per_channel)) + resource.colors_per_channel = 4; + if (resource.colors_per_channel < 2) resource.colors_per_channel = 2; + else if (resource.colors_per_channel > 6) resource.colors_per_channel = 6; + + if (config.getValue("session.styleFile", s)) + resource.style_file = expandTilde(s); else resource.style_file = DEFAULTSTYLE; - resource.double_click_interval = 250; - if (XrmGetResource(database, "session.doubleClickInterval", - "Session.DoubleClickInterval", &value_type, &value) && - sscanf(value.addr, "%lu", &long_value) == 1) { - resource.double_click_interval = long_value; - } - - resource.auto_raise_delay.tv_usec = 400; - if (XrmGetResource(database, "session.autoRaiseDelay", - "Session.AutoRaiseDelay", &value_type, &value) && - sscanf(value.addr, "%lu", &long_value) == 1) { - resource.auto_raise_delay.tv_usec = long_value; - } + if (! config.getValue("session.doubleClickInterval", + resource.double_click_interval)); + resource.double_click_interval = 250; + if (! config.getValue("session.autoRaiseDelay", + resource.auto_raise_delay.tv_usec)) + resource.auto_raise_delay.tv_usec = 400; resource.auto_raise_delay.tv_sec = resource.auto_raise_delay.tv_usec / 1000; resource.auto_raise_delay.tv_usec -= (resource.auto_raise_delay.tv_sec * 1000); resource.auto_raise_delay.tv_usec *= 1000; - resource.cache_life = 5l; - if (XrmGetResource(database, "session.cacheLife", "Session.CacheLife", - &value_type, &value) && - sscanf(value.addr, "%lu", &long_value) == 1) { - resource.cache_life = long_value; - } + if (! config.getValue("session.cacheLife", resource.cache_life)) + resource.cache_life = 5; resource.cache_life *= 60000; - resource.cache_max = 200; - if (XrmGetResource(database, "session.cacheMax", "Session.CacheMax", - &value_type, &value) && - sscanf(value.addr, "%lu", &long_value) == 1) { - resource.cache_max = long_value; - } -} - - -void Blackbox::load_rc(BScreen *screen) { - XrmDatabase database = (XrmDatabase) 0; - - database = XrmGetFileDatabase(rc_file.c_str()); - - XrmValue value; - char *value_type, name_lookup[1024], class_lookup[1024]; - int screen_number = screen->getScreenNumber(); - int int_value; - - sprintf(name_lookup, "session.screen%d.fullMaximization", screen_number); - sprintf(class_lookup, "Session.Screen%d.FullMaximization", screen_number); - screen->saveFullMax(False); - if (XrmGetResource(database, name_lookup, class_lookup, &value_type, - &value) && - ! strncasecmp(value.addr, "true", value.size)) { - screen->saveFullMax(True); - } - - sprintf(name_lookup, "session.screen%d.focusNewWindows", screen_number); - sprintf(class_lookup, "Session.Screen%d.FocusNewWindows", screen_number); - screen->saveFocusNew(False); - if (XrmGetResource(database, name_lookup, class_lookup, &value_type, - &value) && - ! strncasecmp(value.addr, "true", value.size)) { - screen->saveFocusNew(True); - } - - sprintf(name_lookup, "session.screen%d.focusLastWindow", screen_number); - sprintf(class_lookup, "Session.Screen%d.focusLastWindow", screen_number); - screen->saveFocusLast(False); - if (XrmGetResource(database, name_lookup, class_lookup, &value_type, - &value) && - ! strncasecmp(value.addr, "true", value.size)) { - screen->saveFocusLast(True); - } - - sprintf(name_lookup, "session.screen%d.rowPlacementDirection", - screen_number); - sprintf(class_lookup, "Session.Screen%d.RowPlacementDirection", - screen_number); - screen->saveRowPlacementDirection(BScreen::LeftRight); - if (XrmGetResource(database, name_lookup, class_lookup, &value_type, - &value) && - ! strncasecmp(value.addr, "righttoleft", value.size)) { - screen->saveRowPlacementDirection(BScreen::RightLeft); - } - - sprintf(name_lookup, "session.screen%d.colPlacementDirection", - screen_number); - sprintf(class_lookup, "Session.Screen%d.ColPlacementDirection", - screen_number); - screen->saveColPlacementDirection(BScreen::TopBottom); - if (XrmGetResource(database, name_lookup, class_lookup, &value_type, - &value) && - ! strncasecmp(value.addr, "bottomtotop", value.size)) { - screen->saveColPlacementDirection(BScreen::BottomTop); - } - - sprintf(name_lookup, "session.screen%d.workspaces", screen_number); - sprintf(class_lookup, "Session.Screen%d.Workspaces", screen_number); - screen->saveWorkspaces(1); - if (XrmGetResource(database, name_lookup, class_lookup, - &value_type, &value) && - sscanf(value.addr, "%d", &int_value) == 1 && - int_value > 0 && int_value < 128) { - screen->saveWorkspaces(int_value); - } - - sprintf(name_lookup, "session.screen%d.toolbar.widthPercent", - screen_number); - sprintf(class_lookup, "Session.Screen%d.Toolbar.WidthPercent", - screen_number); - screen->saveToolbarWidthPercent(66); - if (XrmGetResource(database, name_lookup, class_lookup, &value_type, - &value) && - sscanf(value.addr, "%d", &int_value) == 1 && - int_value > 0 && int_value <= 100) { - screen->saveToolbarWidthPercent(int_value); - } - - sprintf(name_lookup, "session.screen%d.toolbar.placement", screen_number); - sprintf(class_lookup, "Session.Screen%d.Toolbar.Placement", screen_number); - screen->saveToolbarPlacement(Toolbar::BottomCenter); - if (XrmGetResource(database, name_lookup, class_lookup, &value_type, - &value)) { - if (! strncasecmp(value.addr, "TopLeft", value.size)) - screen->saveToolbarPlacement(Toolbar::TopLeft); - else if (! strncasecmp(value.addr, "BottomLeft", value.size)) - screen->saveToolbarPlacement(Toolbar::BottomLeft); - else if (! strncasecmp(value.addr, "TopCenter", value.size)) - screen->saveToolbarPlacement(Toolbar::TopCenter); - else if (! strncasecmp(value.addr, "TopRight", value.size)) - screen->saveToolbarPlacement(Toolbar::TopRight); - else if (! strncasecmp(value.addr, "BottomRight", value.size)) - screen->saveToolbarPlacement(Toolbar::BottomRight); - } - screen->removeWorkspaceNames(); - - sprintf(name_lookup, "session.screen%d.workspaceNames", screen_number); - sprintf(class_lookup, "Session.Screen%d.WorkspaceNames", screen_number); - if (XrmGetResource(database, name_lookup, class_lookup, &value_type, - &value)) { - string search = value.addr; - string::const_iterator it = search.begin(), - end = search.end(); - while (1) { - string::const_iterator tmp = it; // current string.begin() - it = std::find(tmp, end, ','); // look for comma between tmp and end - screen->addWorkspaceName(string(tmp, it)); // string = search[tmp:it] - if (it == end) break; - ++it; - } - } - - sprintf(name_lookup, "session.screen%d.toolbar.onTop", screen_number); - sprintf(class_lookup, "Session.Screen%d.Toolbar.OnTop", screen_number); - screen->saveToolbarOnTop(False); - if (XrmGetResource(database, name_lookup, class_lookup, &value_type, - &value) && - ! strncasecmp(value.addr, "true", value.size)) { - screen->saveToolbarOnTop(True); - } - - sprintf(name_lookup, "session.screen%d.toolbar.autoHide", screen_number); - sprintf(class_lookup, "Session.Screen%d.Toolbar.autoHide", screen_number); - screen->saveToolbarAutoHide(False); - if (XrmGetResource(database, name_lookup, class_lookup, &value_type, - &value) && - ! strncasecmp(value.addr, "true", value.size)) { - screen->saveToolbarAutoHide(True); - } - - sprintf(name_lookup, "session.screen%d.focusModel", screen_number); - sprintf(class_lookup, "Session.Screen%d.FocusModel", screen_number); - screen->saveSloppyFocus(True); - screen->saveAutoRaise(False); - screen->saveClickRaise(False); - if (XrmGetResource(database, name_lookup, class_lookup, &value_type, - &value)) { - string fmodel = value.addr; - - if (fmodel.find("ClickToFocus") != string::npos) { - screen->saveSloppyFocus(False); - } else { - // must be sloppy - - if (fmodel.find("AutoRaise") != string::npos) - screen->saveAutoRaise(True); - if (fmodel.find("ClickRaise") != string::npos) - screen->saveClickRaise(True); - } - } - - sprintf(name_lookup, "session.screen%d.windowPlacement", screen_number); - sprintf(class_lookup, "Session.Screen%d.WindowPlacement", screen_number); - screen->savePlacementPolicy(BScreen::RowSmartPlacement); - if (XrmGetResource(database, name_lookup, class_lookup, &value_type, - &value)) { - if (! strncasecmp(value.addr, "RowSmartPlacement", value.size)) - /* pass */; - else if (! strncasecmp(value.addr, "ColSmartPlacement", value.size)) - screen->savePlacementPolicy(BScreen::ColSmartPlacement); - else if (! strncasecmp(value.addr, "CascadePlacement", value.size)) - screen->savePlacementPolicy(BScreen::CascadePlacement); - } - - sprintf(name_lookup, "session.screen%d.slit.placement", screen_number); - sprintf(class_lookup, "Session.Screen%d.Slit.Placement", screen_number); - screen->saveSlitPlacement(Slit::CenterRight); - if (XrmGetResource(database, name_lookup, class_lookup, &value_type, - &value)) { - if (! strncasecmp(value.addr, "TopLeft", value.size)) - screen->saveSlitPlacement(Slit::TopLeft); - else if (! strncasecmp(value.addr, "CenterLeft", value.size)) - screen->saveSlitPlacement(Slit::CenterLeft); - else if (! strncasecmp(value.addr, "BottomLeft", value.size)) - screen->saveSlitPlacement(Slit::BottomLeft); - else if (! strncasecmp(value.addr, "TopCenter", value.size)) - screen->saveSlitPlacement(Slit::TopCenter); - else if (! strncasecmp(value.addr, "BottomCenter", value.size)) - screen->saveSlitPlacement(Slit::BottomCenter); - else if (! strncasecmp(value.addr, "TopRight", value.size)) - screen->saveSlitPlacement(Slit::TopRight); - else if (! strncasecmp(value.addr, "BottomRight", value.size)) - screen->saveSlitPlacement(Slit::BottomRight); - } - - sprintf(name_lookup, "session.screen%d.slit.direction", screen_number); - sprintf(class_lookup, "Session.Screen%d.Slit.Direction", screen_number); - screen->saveSlitDirection(Slit::Vertical); - if (XrmGetResource(database, name_lookup, class_lookup, &value_type, - &value) && - ! strncasecmp(value.addr, "Horizontal", value.size)) { - screen->saveSlitDirection(Slit::Horizontal); - } - - sprintf(name_lookup, "session.screen%d.slit.onTop", screen_number); - sprintf(class_lookup, "Session.Screen%d.Slit.OnTop", screen_number); - screen->saveSlitOnTop(False); - if (XrmGetResource(database, name_lookup, class_lookup, &value_type, - &value) && - ! strncasecmp(value.addr, "True", value.size)) { - screen->saveSlitOnTop(True); - } - - sprintf(name_lookup, "session.screen%d.slit.autoHide", screen_number); - sprintf(class_lookup, "Session.Screen%d.Slit.AutoHide", screen_number); - screen->saveSlitAutoHide(False); - if (XrmGetResource(database, name_lookup, class_lookup, &value_type, - &value) && - ! strncasecmp(value.addr, "true", value.size)) { - screen->saveSlitAutoHide(True); - } - -#ifdef HAVE_STRFTIME - sprintf(name_lookup, "session.screen%d.strftimeFormat", screen_number); - sprintf(class_lookup, "Session.Screen%d.StrftimeFormat", screen_number); - if (XrmGetResource(database, name_lookup, class_lookup, &value_type, - &value)) { - screen->saveStrftimeFormat(value.addr); - } else { - screen->saveStrftimeFormat("%I:%M %p"); - } -#else // HAVE_STRFTIME - sprintf(name_lookup, "session.screen%d.dateFormat", screen_number); - sprintf(class_lookup, "Session.Screen%d.DateFormat", screen_number); - screen->saveDateFormat(B_AmericanDate); - if (XrmGetResource(database, name_lookup, class_lookup, &value_type, - &value)) { - if (! strncasecmp(value.addr, "european", value.size)) - screen->saveDateFormat(B_EuropeanDate); - } - - sprintf(name_lookup, "session.screen%d.clockFormat", screen_number); - sprintf(class_lookup, "Session.Screen%d.ClockFormat", screen_number); - screen->saveClock24Hour(False); - if (XrmGetResource(database, name_lookup, class_lookup, &value_type, - &value) && - sscanf(value.addr, "%d", &int_value) == 1 && int_value == 24) { - screen->saveClock24Hour(True); - } -#endif // HAVE_STRFTIME - - sprintf(name_lookup, "session.screen%d.edgeSnapThreshold", screen_number); - sprintf(class_lookup, "Session.Screen%d.EdgeSnapThreshold", screen_number); - if (XrmGetResource(database, name_lookup, class_lookup, &value_type, - &value) && - sscanf(value.addr, "%d", &int_value) == 1) { - screen->saveEdgeSnapThreshold(int_value); - } - - screen->saveImageDither(True); - if (XrmGetResource(database, "session.imageDither", "Session.ImageDither", - &value_type, &value) && - ! strncasecmp("false", value.addr, value.size)) { - screen->saveImageDither(False); - } - - screen->saveOpaqueMove(False); - if (XrmGetResource(database, "session.opaqueMove", "Session.OpaqueMove", - &value_type, &value) && - ! strncasecmp("true", value.addr, value.size)) { - screen->saveOpaqueMove(True); - } - - XrmDestroyDatabase(database); -} - - -void Blackbox::reload_rc(void) { - load_rc(); - reconfigure(); + if (! config.getValue("session.cacheMax", resource.cache_max)) + resource.cache_max = 200; } @@ -1520,20 +1043,8 @@ void Blackbox::reconfigure(void) { void Blackbox::real_reconfigure(void) { - XrmDatabase new_blackboxrc = (XrmDatabase) 0; - char *style = new char[resource.style_file.length() + 20]; - - sprintf(style, "session.styleFile: %s", getStyleFilename()); - XrmPutLineResource(&new_blackboxrc, style); - - delete [] style; - - XrmDatabase old_blackboxrc = XrmGetFileDatabase(rc_file.c_str()); - - XrmMergeDatabases(new_blackboxrc, &old_blackboxrc); - XrmPutFileDatabase(old_blackboxrc, rc_file.c_str()); - if (old_blackboxrc) XrmDestroyDatabase(old_blackboxrc); - + load_rc(); + std::for_each(menuTimestamps.begin(), menuTimestamps.end(), PointerAssassin()); menuTimestamps.clear(); @@ -1584,6 +1095,7 @@ void Blackbox::real_rereadMenu(void) { void Blackbox::saveStyleFilename(const string& filename) { assert(! filename.empty()); resource.style_file = filename; + config.setValue("session.styleFile", resource.style_file); } @@ -1592,7 +1104,7 @@ void Blackbox::addMenuTimestamp(const string& filename) { bool found = False; MenuTimestampList::iterator it = menuTimestamps.begin(); - for (; it != menuTimestamps.end() && !found; ++it) { + for (; it != menuTimestamps.end() && ! found; ++it) { if ((*it)->filename == filename) found = True; } if (! found) { diff --git a/src/blackbox.hh b/src/blackbox.hh index 0545bcc8..e6193ae0 100644 --- a/src/blackbox.hh +++ b/src/blackbox.hh @@ -26,7 +26,6 @@ extern "C" { #include -#include #ifdef HAVE_STDIO_H # include @@ -50,6 +49,7 @@ extern "C" { #include "i18n.hh" #include "BaseDisplay.hh" +#include "Configuration.hh" #include "Timer.hh" #define AttribShaded (1l << 0) @@ -144,6 +144,7 @@ private: BScreen *active_screen; BlackboxWindow *focused_window; BTimer *timer; + Configuration config; bool no_focus, reconfigure_wait, reread_menu_wait; Time last_time; @@ -195,7 +196,6 @@ private: void load_rc(void); void save_rc(void); - void reload_rc(void); void real_rereadMenu(void); void real_reconfigure(void); @@ -228,6 +228,7 @@ public: inline BlackboxWindow *getFocusedWindow(void) { return focused_window; } + inline Configuration *getConfig() { return &config; } inline const Time &getDoubleClickInterval(void) const { return resource.double_click_interval; } inline const Time &getLastTime(void) const { return last_time; } @@ -261,7 +262,6 @@ public: void setFocusedWindow(BlackboxWindow *w); void shutdown(void); - void load_rc(BScreen *screen); void saveStyleFilename(const std::string& filename); void addMenuTimestamp(const std::string& filename); void restart(const char *prog = 0); -- 2.39.2