diff options
author | Pavel Labath <pavelo@centrum.sk> | 2011-07-30 10:21:53 (GMT) |
---|---|---|
committer | Pavel Labath <pavelo@centrum.sk> | 2013-02-18 21:04:25 (GMT) |
commit | 54ed350776d4f78de9aabb0273f085aa7c2ce124 (patch) | |
tree | 994cd8b01e4423c3e535b54a41e30238fce1b10b /src/FbTk | |
parent | fe7a9bf5b0d59d25ef87ca6ccf47e40055596b84 (diff) | |
download | fluxbox_pavel-54ed350776d4f78de9aabb0273f085aa7c2ce124.zip fluxbox_pavel-54ed350776d4f78de9aabb0273f085aa7c2ce124.tar.bz2 |
Create a completely new lua state upon USR2 reconfigure
This way, global variables set by the scripts don't persist between hard reconfigures.
I also cleaned up the reconfig-handling code in fluxbox.cc. Instead of three reconfig functions
(real_reconfig, timed_reconfig, reconfig) we have just one.
Diffstat (limited to 'src/FbTk')
-rw-r--r-- | src/FbTk/LResource.cc | 52 | ||||
-rw-r--r-- | src/FbTk/LResource.hh | 3 |
2 files changed, 40 insertions, 15 deletions
diff --git a/src/FbTk/LResource.cc b/src/FbTk/LResource.cc index d7627c9..0909520 100644 --- a/src/FbTk/LResource.cc +++ b/src/FbTk/LResource.cc | |||
@@ -101,17 +101,8 @@ void LResourceManager::convert(ResourceManager &old, const std::string &new_file | |||
101 | } | 101 | } |
102 | 102 | ||
103 | LResourceManager::LResourceManager(const std::string &root, Lua &l) | 103 | LResourceManager::LResourceManager(const std::string &root, Lua &l) |
104 | : ResourceManager_base(root), m_l(&l) { | 104 | : ResourceManager_base(root), m_l(&l) { |
105 | l.checkstack(2); | 105 | setLua(l); |
106 | lua::stack_sentry s(l); | ||
107 | |||
108 | l.pushstring(root); | ||
109 | |||
110 | l.getfield(lua::REGISTRYINDEX, make_root); | ||
111 | l.pushstring(root); | ||
112 | l.call(1, 1); | ||
113 | |||
114 | l.readOnlySet(lua::GLOBALSINDEX); | ||
115 | } | 106 | } |
116 | 107 | ||
117 | bool LResourceManager::save(const char *filename, const char *) { | 108 | bool LResourceManager::save(const char *filename, const char *) { |
@@ -127,11 +118,20 @@ bool LResourceManager::save(const char *filename, const char *) { | |||
127 | } | 118 | } |
128 | 119 | ||
129 | void LResourceManager::addResource(Resource_base &r) { | 120 | void LResourceManager::addResource(Resource_base &r) { |
121 | ResourceManager_base::addResource(r); | ||
122 | try { | ||
123 | doAddResource(r); | ||
124 | } | ||
125 | catch(...) { | ||
126 | ResourceManager_base::removeResource(r); | ||
127 | throw; | ||
128 | } | ||
129 | } | ||
130 | |||
131 | void LResourceManager::doAddResource(Resource_base &r) { | ||
130 | m_l->checkstack(5); | 132 | m_l->checkstack(5); |
131 | lua::stack_sentry s(*m_l); | 133 | lua::stack_sentry s(*m_l); |
132 | 134 | ||
133 | ResourceManager_base::addResource(r); | ||
134 | |||
135 | m_l->getfield(lua::REGISTRYINDEX, register_resource); | 135 | m_l->getfield(lua::REGISTRYINDEX, register_resource); |
136 | m_l->getfield(lua::GLOBALSINDEX, m_root.c_str()); | 136 | m_l->getfield(lua::GLOBALSINDEX, m_root.c_str()); |
137 | m_l->pushstring(r.name()); | 137 | m_l->pushstring(r.name()); |
@@ -143,7 +143,12 @@ void LResourceManager::addResource(Resource_base &r) { | |||
143 | } | 143 | } |
144 | 144 | ||
145 | void LResourceManager::removeResource(Resource_base &r) { | 145 | void LResourceManager::removeResource(Resource_base &r) { |
146 | m_l->checkstack(5); | 146 | doRemoveResource(r); |
147 | ResourceManager_base::removeResource(r); | ||
148 | } | ||
149 | |||
150 | void LResourceManager::doRemoveResource(Resource_base &r) { | ||
151 | m_l->checkstack(4); | ||
147 | lua::stack_sentry s(*m_l); | 152 | lua::stack_sentry s(*m_l); |
148 | 153 | ||
149 | m_l->getfield(lua::REGISTRYINDEX, register_resource); | 154 | m_l->getfield(lua::REGISTRYINDEX, register_resource); |
@@ -153,8 +158,25 @@ void LResourceManager::removeResource(Resource_base &r) { | |||
153 | m_l->call(3, 1); | 158 | m_l->call(3, 1); |
154 | *static_cast<Resource_base **>(m_l->touserdata(-1)) = NULL; | 159 | *static_cast<Resource_base **>(m_l->touserdata(-1)) = NULL; |
155 | m_l->pop(); | 160 | m_l->pop(); |
161 | } | ||
156 | 162 | ||
157 | ResourceManager_base::removeResource(r); | 163 | void LResourceManager::setLua(Lua &l) { |
164 | l.checkstack(2); | ||
165 | lua::stack_sentry s(l); | ||
166 | |||
167 | for(ResourceList::const_iterator i = begin(); i != end(); ++i) | ||
168 | doRemoveResource(**i); | ||
169 | |||
170 | l.getfield(lua::REGISTRYINDEX, make_root); | ||
171 | l.pushstring(m_root); | ||
172 | l.call(1, 1); | ||
173 | |||
174 | l.readOnlySetField(lua::GLOBALSINDEX, m_root.c_str()); | ||
175 | |||
176 | m_l = &l; | ||
177 | |||
178 | for(ResourceList::const_iterator i = begin(); i != end(); ++i) | ||
179 | doAddResource(**i); | ||
158 | } | 180 | } |
159 | 181 | ||
160 | } // end namespace FbTk | 182 | } // end namespace FbTk |
diff --git a/src/FbTk/LResource.hh b/src/FbTk/LResource.hh index 1567269..bb7f224 100644 --- a/src/FbTk/LResource.hh +++ b/src/FbTk/LResource.hh | |||
@@ -41,8 +41,11 @@ public: | |||
41 | virtual bool save(const char *filename, const char *); | 41 | virtual bool save(const char *filename, const char *); |
42 | virtual void addResource(Resource_base &r); | 42 | virtual void addResource(Resource_base &r); |
43 | virtual void removeResource(Resource_base &r); | 43 | virtual void removeResource(Resource_base &r); |
44 | void setLua(Lua &l); | ||
44 | 45 | ||
45 | private: | 46 | private: |
47 | void doAddResource(Resource_base &r); | ||
48 | void doRemoveResource(Resource_base &r); | ||
46 | 49 | ||
47 | Lua *m_l; | 50 | Lua *m_l; |
48 | }; | 51 | }; |