• Show log

    Commit

  • Hash : 54174409
    Author : Ran Benita
    Date : 2014-03-27T17:42:20

    state: fix consumed modifier calculation
    
    The current calculation is in short:
        entry ? (entry->mask & ~entry->preserve) : 0
    
    This changes it be
        type->mask & ~(entry ? entry->preserve : 0)
    
    This is what Xlib does. While less intuitive, it is actually more
    correct, if you follow this deduction:
    
    - The key group's type->mask defines which modifiers the key even cares
      about. The others are completely irrelevant (and in fact they are
      masked out from all sided in the level calculation). Example: NumLock
      for an alphabetic key.
    
    - The type->mask, the mods which are not masked out, are *all* relevant
      (and in fact in the level calculation they must match *exactly* to the
      state). These mods affect which level is chosen for the key, whether
      they are active or not.
    
    - Because the type->mask mods are all relevant, they must be considered
      as consumed by the calculation *even if they are not active*.
    
    Therefore we use type->mask instead of entry->mask.
    
    The second change is what happens when no entry is found: return 0 or
    just take preserve to be 0? Let's consider an example, the basic type
    
        type "ALPHABETIC" {
            modifiers = Shift+Lock;
            map[Shift] = Level2;
            map[Lock] = Level2;
            level_name[Level1] = "Base";
            level_name[Level2] = "Caps";
        };
    
    Suppose Shift+Lock is active - it doesn't match any entry, thus it gets
    to level 0. The first interpretation would take them both to be
    unconsumed, the second (new one) would take them both to be consumed.
    This seems much better: Caps is active, and Shift disables it, they both
    do something.
    
    This change also fixes a pretty lousy bug (since 0.3.2), where Shift
    appears to apparently *not* disable Caps. What actually happens is that
    Caps is not consumed (see above) but active, thus the implicit
    capitalization in get_one_sym() kicks in and capitalizes it anyway.
    
    Reported-by: Davinder Pal Singh Bhamra
    Signed-off-by: Ran Benita <ran234@gmail.com>
    

  • Properties

  • Git HTTP https://git.kmx.io/kc3-lang/libxkbcommon.git
    Git SSH git@git.kmx.io:kc3-lang/libxkbcommon.git
    Public access ? public
    Description
    Users
    thodg_w kc3_lang_org thodg_l thodg_m www_kmx_io thodg
    Tags