X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=ioncore%2Fbinding.c;h=f4fb0e67a0fd352ea659ec9f7ab08d1cd212b2df;hb=2948134dc6273f6d3ea089c4cc273b69e2f8d51e;hp=740e67baa6cf09dc862e0cebf60ef3a67449c478;hpb=ae4260bb64817c11f9a7140324cd3e3ba113e297;p=ion3.git diff --git a/ioncore/binding.c b/ioncore/binding.c index 740e67b..f4fb0e6 100644 --- a/ioncore/binding.c +++ b/ioncore/binding.c @@ -1,7 +1,7 @@ /* * ion/ioncore/binding.c * - * Copyright (c) Tuomo Valkonen 1999-2007. + * Copyright (c) Tuomo Valkonen 1999-2008. * * See the included file LICENSE for details. */ @@ -95,18 +95,13 @@ static int compare_bindings(const WBinding *a, const WBinding *b) } /* This is only used for searching AnyKey etc. */ -static int compare_bindings_ksb(const WBinding *a, const WBinding *b) +static int compare_bindings_any(const WBinding *a, const WBinding *b) { - int r=CVAL(a, b, act); - if(r==0){ + int r=compare_bindings(a, b); + + if(r==0) r=CVAL(a, b, ksb); - if(r==0){ - r=CVAL(a, b, state); - if(r==0){ - r=CVAL(a, b, area); - } - } - } + return r; } @@ -381,7 +376,7 @@ void binding_grab_on(const WBinding *binding, Window win) binding->act!=BINDING_BUTTONMOTION) return; - if(binding->state==0) + if(binding->state==0 || binding->area!=0) return; #ifndef CF_HACK_IGNORE_EVIL_LOCKS @@ -398,7 +393,7 @@ void binding_grab_on(const WBinding *binding, Window win) void binding_ungrab_on(const WBinding *binding, Window win) { - if(binding->act==BINDING_KEYPRESS){ + if(binding->act==BINDING_KEYPRESS && binding->kcb!=0){ #ifndef CF_HACK_IGNORE_EVIL_LOCKS XUngrabKey(ioncore_g.dpy, binding->kcb, binding->state, win); #else @@ -412,7 +407,7 @@ void binding_ungrab_on(const WBinding *binding, Window win) binding->act!=BINDING_BUTTONMOTION) return; - if(binding->state==0) + if(binding->state==0 || binding->area!=0) return; #ifndef CF_HACK_IGNORE_EVIL_LOCKS @@ -444,7 +439,7 @@ static WBinding *search_binding(WBindmap *bindmap, WBinding *binding) } -static WBinding *search_binding_ksb(WBindmap *bindmap, WBinding *binding) +static WBinding *search_binding_any(WBindmap *bindmap, WBinding *binding) { Rb_node node; int found=0; @@ -453,7 +448,7 @@ static WBinding *search_binding_ksb(WBindmap *bindmap, WBinding *binding) return NULL; node=rb_find_gkey_n(bindmap->bindings, binding, - (Rb_compfn*)compare_bindings_ksb, &found); + (Rb_compfn*)compare_bindings_any, &found); if(found==0) return NULL; @@ -494,13 +489,14 @@ static WBinding *do_bindmap_lookup_binding(WBindmap *bindmap, if(binding==NULL){ tmp.state=state; + tmp.kcb=0; tmp.ksb=(act==BINDING_KEYPRESS ? AnyKey : AnyButton); - binding=search_binding_ksb(bindmap, &tmp); + binding=search_binding_any(bindmap, &tmp); if(binding==NULL){ tmp.state=AnyModifier; - binding=search_binding_ksb(bindmap, &tmp); + binding=search_binding_any(bindmap, &tmp); } } } @@ -542,6 +538,7 @@ int ioncore_unmod(int state, int keycode) #ifdef CF_HACK_IGNORE_EVIL_LOCKS state&=~evilignoremask; #endif + state&=KNOWN_MODIFIERS_MASK; for(j=0; jmax_keypermod; j++){ if(modmap->modifiermap[j]==keycode) @@ -572,6 +569,8 @@ int ioncore_modstate() #ifdef CF_HACK_IGNORE_EVIL_LOCKS state&=~evilignoremask; #endif + state&=KNOWN_MODIFIERS_MASK; + return state; }