• 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

  • README.md

  • Fragments for the changelog

    This directory contains fragments for the future NEWS file.

    Introduction

    We use <code>towncrier</code> to produce useful, summarized news files.

    There are 3 sections types:

    • API: changes/api
    • Tools: changes/tools
    • Build System: changes/build

    There are 3 news fragments types:

    • Breaking changes: .breaking
    • New: .feature
    • Fixes: .bugfix

    Adding a fragment

    Add a short description of the change in a file changes/SECTION/ID.FRAGMENT.md, where:

    • SECTION and FRAGMENT values are described in the previous section.
    • ID is the corresponding issue identifier on Github, if relevant. If there is no such issue, then ID should start with + and some identifier that make the file unique in the directory.

    Examples:

    • A bug fix for the issue #463 is an API change, so the corresponding file should be named changes/api/463.bugfix.md.
    • A new feature for tools like #448 corresponds to e.g. changes/tools/+add-verbose-opt.feature.md.

    Guidelines for the fragment files:

    • Use the Markdown markup.
    • Use past tense, e.g. “Fixed a segfault”.
    • Look at the previous releases NEWS file for further examples.

    Build the changelog

    Install <code>towncrier</code> from Pypi:

    python3 -m pip install towncrier

    Then build the changelog:

    # Only check the result. Useful after adding a new fragment.
    towncrier build --draft --version 1.8.0
    # Write the changelog & delete the news fragments
    towncrier build --yes --version 1.8.0