diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Keys.cc | 72 |
1 files changed, 35 insertions, 37 deletions
diff --git a/src/Keys.cc b/src/Keys.cc index 128ccf4..3dfc37f 100644 --- a/src/Keys.cc +++ b/src/Keys.cc | |||
@@ -19,32 +19,26 @@ | |||
19 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 19 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
20 | // DEALINGS IN THE SOFTWARE. | 20 | // DEALINGS IN THE SOFTWARE. |
21 | 21 | ||
22 | //$Id: Keys.cc,v 1.17 2002/07/27 18:03:39 fluxgen Exp $ | 22 | //$Id: Keys.cc,v 1.18 2002/08/11 21:21:06 fluxgen Exp $ |
23 | 23 | ||
24 | #ifdef HAVE_CONFIG_H | ||
25 | #include "config.h" | ||
26 | #endif | ||
27 | 24 | ||
28 | #include "Keys.hh" | 25 | #include "Keys.hh" |
26 | |||
29 | #include "StringUtil.hh" | 27 | #include "StringUtil.hh" |
30 | 28 | ||
31 | #ifdef HAVE_STDIO_H | 29 | #ifdef HAVE_CONFIG_H |
32 | #include <stdio.h> | 30 | #include "../config.h" |
33 | #endif // HAVE_STDIO_H | 31 | #endif // HAVE_CONFIG_H |
32 | |||
34 | 33 | ||
35 | #ifdef HAVE_CTYPE_H | 34 | #ifdef HAVE_CTYPE_H |
36 | #include <ctype.h> | 35 | #include <ctype.h> |
37 | #endif // HAVE_CTYPE_H | 36 | #endif // HAVE_CTYPE_H |
38 | 37 | ||
39 | #ifdef STDC_HEADERS | 38 | #include <cstdio> |
40 | #include <stdlib.h> | 39 | #include <cstdlib> |
41 | #include <string.h> | 40 | #include <cerrno> |
42 | #include <errno.h> | 41 | #include <cstring> |
43 | #endif // STDC_HEADERS | ||
44 | |||
45 | #if HAVE_STRINGS_H | ||
46 | #include <strings.h> | ||
47 | #endif | ||
48 | 42 | ||
49 | #ifdef HAVE_SYS_TYPES_H | 43 | #ifdef HAVE_SYS_TYPES_H |
50 | #include <sys/types.h> | 44 | #include <sys/types.h> |
@@ -136,7 +130,7 @@ m_abortkey(0), | |||
136 | m_display(display) | 130 | m_display(display) |
137 | { | 131 | { |
138 | assert(display); | 132 | assert(display); |
139 | if (filename) | 133 | if (filename != 0) |
140 | load(filename); | 134 | load(filename); |
141 | } | 135 | } |
142 | 136 | ||
@@ -150,7 +144,7 @@ Keys::~Keys() { | |||
150 | //-------------------------------- | 144 | //-------------------------------- |
151 | void Keys::deleteTree() { | 145 | void Keys::deleteTree() { |
152 | while (!m_keylist.empty()) { | 146 | while (!m_keylist.empty()) { |
153 | if (m_keylist.back()) | 147 | if (m_keylist.back() && m_keylist.back() != 0) |
154 | delete m_keylist.back(); | 148 | delete m_keylist.back(); |
155 | m_keylist.pop_back(); | 149 | m_keylist.pop_back(); |
156 | } | 150 | } |
@@ -181,34 +175,34 @@ bool Keys::load(const char *filename) { | |||
181 | 175 | ||
182 | //ungrab all keys | 176 | //ungrab all keys |
183 | ungrabKeys(); | 177 | ungrabKeys(); |
178 | |||
184 | //free memory of previous grabs | 179 | //free memory of previous grabs |
185 | deleteTree(); | 180 | deleteTree(); |
186 | 181 | ||
187 | XSync(m_display, False); | 182 | XSync(m_display, False); |
188 | 183 | ||
189 | //open the file | 184 | //open the file |
190 | ifstream infile(filename); | 185 | ifstream infile(filename); |
191 | if (!infile) | 186 | if (!infile) |
192 | return false; | 187 | return false; // faild to open file |
193 | 188 | ||
194 | |||
195 | auto_ptr<char> linebuffer(new char[1024]); | ||
196 | |||
197 | int line=0;//current line, so we can tell the user where the fault is | 189 | int line=0;//current line, so we can tell the user where the fault is |
198 | 190 | ||
199 | while (!infile.eof()) { | 191 | while (!infile.eof()) { |
200 | 192 | string linebuffer; | |
201 | infile.getline(linebuffer.get(), 1024); | 193 | |
194 | getline(infile, linebuffer); | ||
202 | 195 | ||
203 | line++; | 196 | line++; |
204 | vector<string> val; | 197 | vector<string> val; |
205 | //Parse arguments | 198 | //Parse arguments |
206 | StringUtil::stringtok(val, linebuffer.get()); | 199 | StringUtil::stringtok(val, linebuffer.c_str()); |
200 | |||
207 | //must have at least 1 argument | 201 | //must have at least 1 argument |
208 | if (val.size()<=0) | 202 | if (val.size() <= 0) |
209 | continue; | 203 | continue; |
210 | 204 | ||
211 | if (val[0][0]=='#') //the line is commented | 205 | if (val[0][0] == '#') //the line is commented |
212 | continue; | 206 | continue; |
213 | 207 | ||
214 | unsigned int key=0, mod=0; | 208 | unsigned int key=0, mod=0; |
@@ -253,7 +247,7 @@ bool Keys::load(const char *filename) { | |||
253 | if (i < LASTKEYGRAB ) { | 247 | if (i < LASTKEYGRAB ) { |
254 | if (!current_key) { | 248 | if (!current_key) { |
255 | cerr<<"Error on line: "<<line<<endl; | 249 | cerr<<"Error on line: "<<line<<endl; |
256 | cerr<<linebuffer.get()<<endl; | 250 | cerr<<linebuffer<<endl; |
257 | delete current_key; | 251 | delete current_key; |
258 | current_key = 0; | 252 | current_key = 0; |
259 | last_key = 0; | 253 | last_key = 0; |
@@ -280,7 +274,7 @@ bool Keys::load(const char *filename) { | |||
280 | case Keys::EXECUTE: | 274 | case Keys::EXECUTE: |
281 | last_key->execcommand = | 275 | last_key->execcommand = |
282 | const_cast<char *> | 276 | const_cast<char *> |
283 | (StringUtil::strcasestr(linebuffer.get(), | 277 | (StringUtil::strcasestr(linebuffer.c_str(), |
284 | getActionStr(Keys::EXECUTE))+ | 278 | getActionStr(Keys::EXECUTE))+ |
285 | strlen(getActionStr(Keys::EXECUTE))); | 279 | strlen(getActionStr(Keys::EXECUTE))); |
286 | break; | 280 | break; |
@@ -330,9 +324,9 @@ bool Keys::load(const char *filename) { | |||
330 | last_key = 0; | 324 | last_key = 0; |
331 | 325 | ||
332 | } else { //destroy list if no action is found | 326 | } else { //destroy list if no action is found |
333 | #ifdef DEBUG | 327 | #ifdef DEBUG |
334 | cerr<<"Didnt find action="<<val[argc]<<endl; | 328 | cerr<<"Didnt find action="<<val[argc]<<endl; |
335 | #endif | 329 | #endif // DEBUG |
336 | //destroy current_key ... this will also destroy the last_key | 330 | //destroy current_key ... this will also destroy the last_key |
337 | delete current_key; | 331 | delete current_key; |
338 | current_key = 0; | 332 | current_key = 0; |
@@ -424,9 +418,10 @@ unsigned int Keys::getModifier(const char *modstr) { | |||
424 | {"MOD5", Mod5Mask}, | 418 | {"MOD5", Mod5Mask}, |
425 | {0, 0} | 419 | {0, 0} |
426 | }; | 420 | }; |
427 | 421 | ||
422 | // find mod mask string | ||
428 | for (unsigned int i=0; modlist[i].string!=0; i++) { | 423 | for (unsigned int i=0; modlist[i].string!=0; i++) { |
429 | if (modlist[i]==modstr) | 424 | if (modlist[i] == modstr) |
430 | return modlist[i].mask; | 425 | return modlist[i].mask; |
431 | } | 426 | } |
432 | 427 | ||
@@ -552,6 +547,7 @@ void Keys::showKeyTree(t_key *key, unsigned int w) { | |||
552 | cerr<<"( "<<(int)key->key<<" "<<(int)key->mod<<" ) {"<<getActionStr(key->action)<<"}"<<endl; | 547 | cerr<<"( "<<(int)key->key<<" "<<(int)key->mod<<" ) {"<<getActionStr(key->action)<<"}"<<endl; |
553 | } | 548 | } |
554 | #endif //DEBUG | 549 | #endif //DEBUG |
550 | |||
555 | //------------ mergeTree --------------- | 551 | //------------ mergeTree --------------- |
556 | // Merges two chains and binds new keys | 552 | // Merges two chains and binds new keys |
557 | // Returns true on success else false. | 553 | // Returns true on success else false. |
@@ -621,7 +617,9 @@ Keys::t_key::t_key(t_key *k) { | |||
621 | Keys::t_key::~t_key() { | 617 | Keys::t_key::~t_key() { |
622 | while (!keylist.empty()) { | 618 | while (!keylist.empty()) { |
623 | t_key *k = keylist.back(); | 619 | t_key *k = keylist.back(); |
624 | delete k; | 620 | if (k != 0) { // make sure we don't have a bad key pointer |
625 | keylist.pop_back(); | 621 | delete k; |
622 | keylist.pop_back(); | ||
623 | } | ||
626 | } | 624 | } |
627 | } | 625 | } |