On 2008-04-30 21:34 +0400, Evgeny Kurbatov wrote:
> Yes. Such a behaviour I observed since first release if ion3 I used, it
> was far ago (I was too lasy to report this bug). The bug looks like
> this. The workspace list binded on Win+W combination and this list
> raised when I press Win+W or Win+Tse (Tse is russian symbol mapped onto
> W key in russian layout). After list raised I can select something with
> mouse or cursor keys. The mouse selection works independently on
> current keyboard layout but keyboard selection (i.e. when I press enter
> on needed item) works for default layout only, so if the russian layout
> set, pressing Enter do not lead to any action until I switch keyboard
> layout to default. This is the bug.
Keys that are not available in the russian layout, clearly can not
be bound then, because the binding mechanism is symbol-based instead
of positional (standard X not offering positional information; that
would demand the piece of crap known as XKb). You should use
Mode_Switch for multiple keymaps (which can be either locking or
or not). However, there also appears to be a bug in keymap refresh
when the keymaps are changed: if I did 'setxkbmap -layout ru' and
then returned to 'fi', some of the keys were gone for good in already
existing frames. The attached patch should fix that.
--
Tuomo
Fri May 2 12:45:18 EEST 2008 Tuomo Valkonen <[EMAIL PROTECTED]>
* Binding refresh fixes on keymap change
diff -rN -u old-ion-3-work1.1/ioncore/binding.c
new-ion-3-work1.1/ioncore/binding.c
--- old-ion-3-work1.1/ioncore/binding.c 2008-05-02 12:45:58.828442190 +0300
+++ new-ion-3-work1.1/ioncore/binding.c 2008-05-02 12:45:58.836440838 +0300
@@ -95,18 +95,13 @@
}
/* 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;
}
@@ -398,7 +393,7 @@
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
@@ -444,7 +439,7 @@
}
-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 @@
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 @@
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);
}
}
}