• Show log

    Commit

  • Hash : 9ede705b
    Author : Pierre Le Marre
    Date : 2025-04-13T09:50:18

    state: Capitalization transformation in xkb_state_key_get_syms
    
    Previously `xkb_state_key_get_syms()` did not perform capitalization
    tranformation, while `xkb_state_key_get_one_sym()` does perform it.
    
    This is unfortunate if we want to promote the use of multiple keysyms
    per levels.
    
    The API make it difficult to change now though: we return a pointer to
    an immutable array rather than filling a buffer. While we could use an
    internal buffer in `xkb_state`, this option would limit the API to
    *sequential* calls of `xkb_state_key_get_syms()` or require some buffer
    handling (e.g. rotation).
    
    Instead we now store the capitalization directly in `xkb_level`. We
    modified `xkb_level` like so (see below for discussion about the size):
    
    ```diff
     struct xkb_level {
    -    unsigned int num_syms;
    +    uint16_t     num_syms;
    -    unsigned int num_actions;
    +    uint16_t     num_actions;
    +    union {
    +        /** num_syms == 1: Upper keysym */
    +        xkb_keysym_t upper;
    +        /** num_syms >  1: Indicate if `syms` contains the upper case
    +         *                 keysyms after the lower ones. */
    +        bool has_upper;
    +    };
         union {
             xkb_keysym_t sym;          /* num_syms == 1 */
             xkb_keysym_t *syms;        /* num_syms > 1  */
         } s;
         union {
             union xkb_action action;   /* num_actions == 1 */
             union xkb_action *actions; /* num_actions >  1 */
         } a;
     };
    ```
    
    - When `level.num_syms` <= 1, we store the upper keysym in `level.upper`.
    - Else if there no cased syms, we set `level.has_upper` to false.
    - Else if there are some cased syms, we set `level.has_upper`` to `true`
      and we double the original size of `level.s.syms`, but *without*
      modifying `level.num_syms`. We then append the transformed keysyms
      right after the original ones, so that we can access them by a simple
      pointer operation: `level.s.syms + level.num_syms`.
    
    The memory footprint is *unchanged*, thanks to the reduced fields for
    actions and keysyms counts.
    

  • 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

    keymap handling library for toolkits and window systems

    Users
    thodg_m kc3_lang_org thodg_w www_kmx_io thodg thodg_l
    Tags