aboutsummaryrefslogtreecommitdiff
path: root/st.c
diff options
context:
space:
mode:
authorRoberto E. Vargas Caballero <k0ga@shike2.com>2013-06-23 10:33:53 +0200
committerRoberto E. Vargas Caballero <k0ga@shike2.com>2013-07-04 09:21:57 +0200
commit6e1c7c8afce3a0e6f896231a3155a27543d261e5 (patch)
tree456a2c4de042d4b6a3928e4463275e58eff03ceb /st.c
parent90c6f055b637a58da0381a21b4a290ce26f56d8f (diff)
downloadst-6e1c7c8afce3a0e6f896231a3155a27543d261e5.tar.gz
st-6e1c7c8afce3a0e6f896231a3155a27543d261e5.zip
Fix match function bugs
There were two problems with match denfinition. 1) There was a forward declaration in the form: static inline bool match(uint, uint); but later the function was defined as: inline bool match(uint mask, uint state) { This causes that there were two different functions in the code, one local and inline, and other inline but extern. All was working without problems due to we were using -Os, and the compiler was using the extern definition and it was no expanding the static declaration. If you removed the -Os flag, then you got linker errors due it was no able to find the static definition of the static declaration. 2) The mask checking was incorrect because we were doing the test: (state & mask) != state and this test only was saying that at least all the enabled bits of state were enabled also in mask, but no all the possible bits in mask. This was the origin of the bug reported by Xavier Cartron, where he said it was possible activated some shortcuts with some of the modifiers defined in the config.h file.
Diffstat (limited to 'st.c')
-rw-r--r--st.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/st.c b/st.c
index 2809592..66aca2d 100644
--- a/st.c
+++ b/st.c
@@ -3355,17 +3355,17 @@ focus(XEvent *ev) {
3355 } 3355 }
3356} 3356}
3357 3357
3358inline bool 3358static inline bool
3359match(uint mask, uint state) { 3359match(uint mask, uint state) {
3360 state &= ~(ignoremod); 3360 state &= ~ignoremod;
3361 3361
3362 if(mask == XK_NO_MOD && state) 3362 if(mask == XK_NO_MOD && state)
3363 return false; 3363 return false;
3364 if(mask != XK_ANY_MOD && mask != XK_NO_MOD && !state) 3364 if(mask != XK_ANY_MOD && mask != XK_NO_MOD && !state)
3365 return false; 3365 return false;
3366 if((state & mask) != state) 3366 if(mask == XK_ANY_MOD)
3367 return false; 3367 return true;
3368 return true; 3368 return state == mask;
3369} 3369}
3370 3370
3371void 3371void