X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=ioncore%2Fbinding.c;h=f4fb0e67a0fd352ea659ec9f7ab08d1cd212b2df;hb=2948134dc6273f6d3ea089c4cc273b69e2f8d51e;hp=7b80d111776d7572a29d9d8afc7784b2dd17badd;hpb=803afbc1cd633f6c025bcd9537e9b7e9aedadd0d;p=ion3.git diff --git a/ioncore/binding.c b/ioncore/binding.c index 7b80d11..f4fb0e6 100644 --- a/ioncore/binding.c +++ b/ioncore/binding.c @@ -1,12 +1,9 @@ /* * ion/ioncore/binding.c * - * Copyright (c) Tuomo Valkonen 1999-2007. + * Copyright (c) Tuomo Valkonen 1999-2008. * - * Ion is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation; either version 2.1 of the License, or - * (at your option) any later version. + * See the included file LICENSE for details. */ #include @@ -98,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; } @@ -384,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 @@ -401,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 @@ -415,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 @@ -447,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; @@ -456,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; @@ -486,19 +478,25 @@ static WBinding *do_bindmap_lookup_binding(WBindmap *bindmap, binding=search_binding(bindmap, &tmp); + if(BINDING_IS_PSEUDO(act)){ + /* No use trying anything else */ + return binding; + } + if(binding==NULL){ tmp.state=AnyModifier; binding=search_binding(bindmap, &tmp); 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); } } } @@ -540,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) @@ -570,6 +569,8 @@ int ioncore_modstate() #ifdef CF_HACK_IGNORE_EVIL_LOCKS state&=~evilignoremask; #endif + state&=KNOWN_MODIFIERS_MASK; + return state; }